我必须生成一个列表,其中包含通过Prolog中的元编程的所有基础术语。我做到了,但最后一个元素我不知道为什么重复,这里是我的代码:
KB:
parent(aa,vv).
parent(bb,aa).
parent(bb,cc).
parent(dd,bb).
ancestor(X,Y):- parent(X,Y).
ancestor(X,Y):- ancestor(X,Z),parent(Z,Y).
这是元解释器:
solve(true,true,_):-!.
solve((A,B),(ProofA,ProofB),Rest):- !, solve(A,ProofA,Rest), solve(B,ProofB,Rest).
solve(A,(A:-Proof), [A:-Proof|Rest]):- ground(A),clause(A,B),solve(B,Proof,Rest).
solve(A,(A:-Proof), List):- clause(A,B),solve(B,Proof,List).
我的查询是:solve(ancestor(dd,vv),H,N).
正如我之前所说,解释器在列表中插入所有基础事实,但它复制了最后一个元素。你可以看到它编译我的代码。
你能帮帮我吗?
答案 0 :(得分:1)
solve/3
谓词的最后一个句子与前一个谓词重叠。即它不会验证您尝试证明的当前目标是不是基础。您可以使用if-then-else控件构造添加该测试\+ ground(A)
或将最后两个子句合并为一个:
solve(A, (A:-Proof), List) :-
( ground(A) ->
List = [A:-Proof| Rest],
clause(A, B),
solve(B, Proof, Rest)
; clause(A, B),
solve(B, Proof, List)
).
但是你对这个谓词的定义很奇怪。在调用子句之后,ground/1
测试不应该完成吗?您是否应该验证B == true
以确保您使用KB中的事实?
答案 1 :(得分:0)
试试这个: 而不是你的
solve(true,true,_)
把这个
solve(true,true,[])