Использование индукции, чтобы определить, составляют ли данные символы действительную формулу в прологе

Мы только начали изучать пролог в моем классе, и наше первое упражнение выглядит следующим образом:

Проблема:

Примечание: предположим, что таких атомов, как 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).

Я считаю, что способ, которым я структурировал свою программу, правильный, но рекурсивная часть не работает (я также получаю там одноэлементную ошибку). Я пытаюсь понять это часами, но безрезультатно. Любая помощь будет оценена по достоинству.


person Luis Averhoff    schedule 04.04.2016    source источник


Ответы (1)


Вы уже правильно поняли атомы. Теперь просто пройдемся по индуктивному определению формулы пропозициональной логики:

at(a). % Our first atom.
at(b). % Our second atom.

fmla(F):-           % an atom is a formula
    at(F).

fmla(neg(F)) :-     % neg(F) is a formula if F is a formula
    fmla(F).

fmla(or(F,G)) :-    % or(F,G) is a formula if F and G are formulas
    fmla(F),
    fmla(G).

fmla(and(F,G)) :-   % and(F,G) is a formula if F and G are formulas
    fmla(F),
    fmla(G).

Если вы попытаетесь запросить это с помощью приведенного выше примера:

   ?- fmla(or(neg(a), b)).
yes

Нужно ли вам последнее правило для конъюнкции или нет, зависит от того, какого индуктивного определения вы придерживаетесь. В некоторых учебниках используются только отрицание и дизъюнкция, поскольку конъюнкция может быть выражена как and(A,B) = neg(or(neg(A),neg(B))).

person tas    schedule 04.04.2016