Мы только начали изучать пролог в моем классе, и наше первое упражнение выглядит следующим образом:
Проблема:
Примечание: предположим, что таких атомов, как a и b, всего два, а не бесконечно много.
а) Напишите программу на прологе, которая переводит индуктивное определение формулы пропозициональной логики (т. е. переводит определение 1). Для этого нужно использовать:
1.) унарный предикат «at» для обозначения атомарных формул (таким образом, «at(f)» означает «F — атомарная формула», где f — константа).
2.) унарный предикат «fmla» для обозначения формул (таким образом, «fmla(F)» означает «F есть формула»).
3.) унарная операция «neg» для обозначения отрицания (таким образом, «neg(F)» означает ¬F).
4.) бинарная операция «или» для обозначения дизъюнкции двух формул (таким образом, «или(F,G)» означает (F∨G)).
Попытка:
at(a). % Our first atom.
at(b). % Our second atom.
fmla(F):-
at(F).
neg(F):-
fmla(F).
or(F,G):-
fmla(F), fmla(G).
fmla(F):-
or(F,G),
neg(F),
fmla(G).
Пример допустимой формулы: (~A v B) ---> or(neg(a), b).
Я считаю, что способ, которым я структурировал свою программу, правильный, но рекурсивная часть не работает (я также получаю там одноэлементную ошибку). Я пытаюсь понять это часами, но безрезультатно. Любая помощь будет оценена по достоинству.