Prolog 模式匹配:查询返回';否';即使提供了基本情况

Prolog 模式匹配:查询返回';否';即使提供了基本情况,prolog,pattern-matching,Prolog,Pattern Matching,我有一个简单的Prolog程序,我需要一些帮助调试。 重点是通过模式匹配来扩展程序,为命题逻辑创建一个证明检查器。我的问题是,当我期望是的时候,我得到了否定,而我的“修复”(为有效的证明提供了一个基本案例)仍然给了我两个解决方案,我不知道为什么 还不知道如何调试Prolog,抱歉 %call: valid_proof([p],p,[[1, p, premise]]) %src: reverse_it([],Z,Z). reverse_it([H|T],Z,Acc) :- reverse_i

我有一个简单的Prolog程序,我需要一些帮助调试。 重点是通过模式匹配来扩展程序,为命题逻辑创建一个证明检查器。我的问题是,当我期望是的时候,我得到了否定,而我的“修复”(为有效的证明提供了一个基本案例)仍然给了我两个解决方案,我不知道为什么

还不知道如何调试Prolog,抱歉

%call:
valid_proof([p],p,[[1, p, premise]])

%src:

reverse_it([],Z,Z).

reverse_it([H|T],Z,Acc) :- reverse_it(T,Z,[H|Acc]).


valid_proof(Prems,Goal,Proof):-
    last(Proof, [_, Goal, _]),
    reverse_it(Proof, RevP, []),
    valid_proof_aux(Prems, RevP) .

valid_proof_aux(Prems,
        [[_,Prop,premise] | T]):-
    memberchk(Prop,Prems),
    valid_proof_aux(Prems,T).

%my 'fix'
valid_proof_aux(_, []) :- true .

你没有真正展示如何运行程序以及你得到了什么(你应该编辑你的问题并添加这个),所以这个答案有点猜测,但无论如何:

无论哪种方式,您都需要基本情况(正如您自己所观察到的那样),
有效证明辅助/2
将在列表变为空且不再匹配时失败

?- [] = [_|_]. % try to unify an empty list with a non-empty list
false.
要摆脱选择点,您需要做的是将list参数作为第一个参数

valid_proof_aux([], _).
valid_proof_aux([[_,Prop,premise]|T], Prems) :-
    memberchk(Prop, Prems),
    valid_proof_aux(T, Prems).

请注意,您不需要
:-true.
,这是隐式的。另外,避免在
[Head | Tail]

中的
两侧留下空格,因为您忘记切换到有效的\u-proof_-aux(T,Prems:)@一开始我确实使用了EJB,但现在我发现它是正确的?一个问题:为什么在我运行程序时Prolog会给我一个“true”提示?@ejbs您使用的是哪种实现?你应该在你的问题中包括你与Prolog解释器交互的确切内容,这样其他人就更容易知道你在处理什么。查看原始Q当提示“true”时,我按enter键。如您所示,您的程序是否在编译时没有任何警告或错误?如果没有,您看到的警告或错误是什么?(您永远不应该忽略警告,它们几乎总是表明您的代码存在真正的问题)。