附加返回假

时间:2018-12-04 18:20:51

标签: prolog

我在序言中有以下规则,其中将公式中的每个常量(一个常量定义为c(a))添加到一个常量列表中,但是,我的append语句不断返回false。

getCONSTs( tt, []).
getCONSTs( ff, []).
getCONSTs( c(C), [C]).
getCONSTs( and(Q1, Q2), ListConstants) :-
   append(getCONSTs(Q1,A1),getCONSTs(Q2,A2),L1).

在上面的append语句中,如果我给规则一个查询,例如:

?- getCONSTs(and(c(A),c(B)),[]).

append语句应列出常数:[A,B]

1 个答案:

答案 0 :(得分:0)

您在这里要执行的操作是调用append/3,并将函子getCONSTs/2作为函子的前两个参数,因此这是 not 列表。当然,存在一个具有相同名称的谓词,但是请注意,即使Prolog会调用谓词,它也只能撤消truefalse(或引发错误,或者陷入无限循环)。但是,甚至没有调用谓词也没有发生:您构造了一个术语,并且存在一个具有相同名称的谓词更为“巧合”。

在Prolog中,通过统一变量和值来传递值,然后使用该变量调用另一个谓词,例如:

getCONSTs(and(Q1, Q2), L) :-
    getCONSTs(Q1, A1),
    getCONSTs(Q2, A2),
    append(A1, A2, L).

请注意,呼叫方式为:

?- getCONSTs(and(c(A),c(B)), []).
false.

仍会生成false,因为在这里您基本上会查询“ and(c(A), c(B))的getConsts是否等于[]”。为了生成列表,您应该再次使用一个变量,例如:

?- getCONSTs(and(c(A),c(B)), L).
L = [A, B].