Prolog 元编程序言,基本事实列表

Prolog 元编程序言,基本事实列表,prolog,Prolog,我必须生成一个列表,其中包含在Prolog中通过元编程的所有基本术语。我做到了,但最后一个元素我不知道为什么是重复的,这里是我的代码: KB: 以下是元解释器: 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)

我必须生成一个列表,其中包含在Prolog中通过元编程的所有基本术语。我做到了,但最后一个元素我不知道为什么是重复的,这里是我的代码:

KB:

以下是元解释器:

 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(祖先(dd,vv),H,N)。

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


你能帮帮我吗?

你的
solve/3
谓词的最后一个子句与前一个重叠。也就是说,它不会验证您试图证明的当前目标是否为基础。您可以添加该测试,
\+ground(A)
,或者使用if-then-else控件构造将最后两个子句组合在一个子句中:

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
以确保您使用的是知识库中的事实

试试这个: 而不是你的

solve(true,true,_)
把这个

solve(true,true,[])

好的,谢谢。将代码作为第3行删除第4行,结果列表不包含所有元素,只包含2个。查询solve(祖先(dd,vv),H,N)返回H的正确答案,但H中的元素并不都在列表中。主要目标是把H的所有元素作为N(列表)的单个元素,请帮助我。你能详细说明这是如何解决OP的问题的吗?
solve(true,true,[])