我在序言中有以下规则,其中将公式中的每个常量(一个常量定义为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]
答案 0 :(得分:0)
您在这里要执行的操作是调用append/3
,并将函子getCONSTs/2
作为函子的前两个参数,因此这是 not 列表。当然,存在一个具有相同名称的谓词,但是请注意,即使Prolog会调用谓词,它也只能撤消true
或false
(或引发错误,或者陷入无限循环)。但是,甚至没有调用谓词也没有发生:您构造了一个术语,并且存在一个具有相同名称的谓词更为“巧合”。
在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].