[英]Prolog - formulas in propositional logic
我试图做一个谓词来验证给定的输入是否代表一个公式。
我只允许使用像 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
,如果给定的结构是公式,则返回 true,否则返回 false。 另外,我不必在公式中使用变量,只使用下面提到的命题原子。
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(and(q, imp(or(p, q), neg(p)))).
,调用返回true
和false
值。 你能告诉我为什么会这样吗?
您选择用于表示公式的数据结构称为“defaulty”,因为您需要一个“默认”案例来测试原子标识符:不是上述内容(和,或,否定,imp)并满足 logical_atom/1 的所有内容是一个逻辑原子(在您的表示中)。 解释器无法通过它们的函子来区分这些情况以应用第一参数索引。 与和/或/等类似,它也为原子变量配备专用函子,比如“atom(...)”,这样更简洁。 wff/1 然后可以读取:
wff(atom(_)).
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(and(atom(q), imp(or(atom(p), atom(q)), neg(atom(p))))).
true.
如果您的公式最初没有以这种方式表示,最好先将它们转换为这种形式,然后使用这种不默认的表示形式进行进一步处理。
另一个优点是,您现在不仅可以轻松测试,还可以使用以下代码枚举格式良好的公式:
wff(atom(_)) --> [].
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).
和一个查询,如:
?- length(Ls, _), phrase(wff(W), Ls), writeln(W), false.
产量:
atom(_G490)
neg(atom(_G495))
and(atom(_G499),atom(_G501))
neg(neg(atom(_G500)))
or(atom(_G499),atom(_G501))
imp(atom(_G499),atom(_G501))
and(atom(_G502),neg(atom(_G506)))
and(neg(atom(_G504)),atom(_G506))
neg(and(atom(_G504),atom(_G506)))
neg(neg(neg(atom(_G505))))
neg(or(atom(_G504),atom(_G506)))
neg(imp(atom(_G504),atom(_G506)))
etc.
作为它的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.