模式匹配:查询 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]
.
中 |
的两侧留下任何空白
我有一个简单的 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]
.
|
的两侧留下任何空白