Я пытаюсь создать предикат, чтобы проверить, представляет ли данный ввод формулу.
Мне разрешено использовать только пропозициональные атомы, такие как 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
ценности. Подскажите, пожалуйста, почему так происходит?