Пролог - формулы в логике высказываний

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

Мне разрешено использовать только пропозициональные атомы, такие как p, q, r , s, t и т. д. Формулы, которые я должен проверить, следующие:

neg(X) - represents the negation of X  
and(X, Y) - represents X and Y  
or(X, Y) - represents X or Y  
imp(X, Y) - represents X implies Y  

Я создал предикат wff , который возвращает истину, если данная структура является формулой, и ложь в противном случае. Кроме того, мне не нужно использовать переменные внутри формулы, только пропозициональные атомы, как указано ниже.

logical_atom( A ) :-
    atom( A ),     
    atom_codes( A, [AH|_] ),
    AH >= 97,
    AH =< 122.

wff(A):-
    \+ ground(A),
    !,
    fail.

wff(and(A, B)):-
    wff(A),
    wff(B).

wff(neg(A)):-
    wff(A).

wff(or(A, B)):-
    wff(A),
    wff(B).

wff(imp(A, B)):-
    wff(A),
    wff(B).

wff(A):-
    ground(A),
    logical_atom(A),
    !.

Когда я представляю такой тест, как этот, wff (и (q, imp (or (p, q), neg (p)))). , вызов возвращает как true , так и false ценности. Подскажите, пожалуйста, почему так происходит?

5
задан Guy Coder 13 March 2017 в 23:25
поделиться