Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отсечение перебора, Нужно отсечь перебор 
:(
    Опции темы
Tomsk11
Дата 10.3.2013, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.4.2011

Репутация: нет
Всего: нет



Приветствую всех!
Столкнулся с проблемой.
Вот условие задачи:
Определим операторы:
:- op( 100, fy, ~).
:- op( 110, xfy, &).
:- op( 120, xfy, v).
Булева формула есть терм, определяемый следующим образом: константы true и false - булевы формулы; если X и Y - булевы формулы, то и X v Y, X & Y, ~X - булевы формулы, здесь v и & - бинарные инфиксные операторы дизъюнкции и конъюнкции, а ~ - унарный оператор отрицания. Напишите программу, задающую отношение negation_inward(+F1,-F2), которое выполнено, если логическая формула F2 получается из логической формулы F1 внесением всех операторов отрицания внутрь конъюнкций и дизъюнкций.
Подсказка. Вы должны написать по одному правилу для каждого следующего случая:
(для краткости записи используем обозначения из математической логики)
1. Если исходная формула имеет вид true или false, то ответ совпадает с исходной формулой.
2. Если исходная формула имеет вид ~X или X, где X есть атом, то ответ совпадает с исходной формулой.
3. Если исходная формула имеет вид ~~X, то результат равен рекурсивному применению предиката negation_inward для X.
4. Если исходная формула имеет вид X & Y, то результат равен конъюнкции рекурсивных вызовов предиката negation_inward для X и Y.
5. Если исходная формула имеет вид X v Y, то результат равен дизъюнкции рекурсивных вызовов предиката negation_inward для X и Y.
6. Если исходная формула имеет вид ~(X v Y), то результат равен конъюнкции рекурсивных вызовов предиката negation_inward для ~X и ~Y (закон де Моргана).
7. Если исходная формула имеет вид ~(X & Y), то результат равен дизъюнкции рекурсивных вызовов предиката negation_inward для ~X и ~Y (закон де Моргана).

Вот код программы:
:- op( 100, fy, ~).
:- op( 110, xfy, &).
:- op( 120, xfy, v).
 
neg(~(A & B),NeA v NeB):-!,neg(~A,NeA),neg(~B,NeB).
neg(~(A v B),NeA & NeB):-!,neg(~A,NeA), neg(~B,NeB).
neg(A & B,NewA & NewB):-!,neg(A,NewA),neg(B,NewB).
neg(A v B, NewA v NewB):-!,neg(A,NewA),neg(B,NewB).
neg(~(~A),NewA):-neg(A,NewA).
neg(F,F).

В итоге получается, что в виде ответом выводятся 4 ответа (из которых только 4-ый является верным):
Neg(~(false v true), X).

X= true & false;
X=true&~true
X=~false&false
X=~false & ~ true

Нужно убрать другие ответы, каким-то образом отсечь их. Буду благодарен за совет. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.