模式匹配:查询 returns 'no' 即使提供了基本情况

Pattern-matching: query returns 'no' even when base case provided

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

抱歉,还不确定如何调试 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 .

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

无论哪种方式你都需要基本情况​​(正如你自己观察的那样),当列表变为空 [] 并且不再匹配 [[...]|T]valid_proof_aux/2 会失败。

?- [] = [_|_]. % try to unify an empty list with a non-empty list
false.

要摆脱选择点,你需要做的是将列表参数作为第一个参数。

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

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

| 的两侧留下任何空白