![]() |
|
![]() ![]() ![]() |
|
Tomsk11 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 Нужно убрать другие ответы, каким-то образом отсечь их. Буду благодарен за совет. |
|||
|
||||
![]() ![]() ![]() |
Правила форума Prolog | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Prolog | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |