5

我正在尝试制作谓词以验证给定输入是否代表公式。

我只能使用命题原子,如 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)))).,调用会返回truefalse值。你能告诉我为什么会这样吗?

4

1 回答 1

11

您选择表示公式的数据结构称为“defaulty”,因为您需要一个“default”案例来测试原子标识符:所有不是上述内容(and,or,neg,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.

作为它的输出。

于 2010-10-16T10:21:10.543 回答