元编程Prolog,基本事实清单

时间:2014-04-02 10:32:29

标签: prolog

我必须生成一个列表,其中包含通过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).

正如我之前所说,解释器在列表中插入所有基础事实,但它复制了最后一个元素。你可以看到它编译我的代码。

你能帮帮我吗?

2 个答案:

答案 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,[])