Recursion prolog中的递归和basecase
我有一个功能,我不能得到正确运行,我不知道为什么。我认为这可能与基本情况有关 这就是我所拥有的:Recursion prolog中的递归和basecase,recursion,prolog,Recursion,Prolog,我有一个功能,我不能得到正确运行,我不知道为什么。我认为这可能与基本情况有关 这就是我所拥有的: recursion(Start, [Tail|Tails], [Alpha|Alphas], Beta, [X|Xs]):- third(Start, Alpha, S), second(S,Beta,Tail,X), recursion(Start, Tails, Alphas, Beta,Xs). recursion([],[],[],_,[]). 我知道第二个函数工作正常,但当我
recursion(Start, [Tail|Tails], [Alpha|Alphas], Beta, [X|Xs]):-
third(Start, Alpha, S),
second(S,Beta,Tail,X),
recursion(Start, Tails, Alphas, Beta,Xs).
recursion([],[],[],_,[]).
我知道第二个函数工作正常,但当我运行此函数时:
recursion([1, 2], [1, 2], [[1, 1], [2, 2]], 0, X).
我得到:
T Call: (6) recursion([1, 2], [1, 2], [[1, 1], [2, 2]], 0, _G3980)
T Fail: (6) recursion([1, 2], [1, 2], [[1, 1], [2, 2]], 0, _G3980)
false.
我的其他谓词可以找到:
second(A,B,_,1) :- A > B.
second(A,B,C,C) :- A == B.
second(A,B,_,-1) :- A < B.
third([A|As], [B|Bs], X) :-
third(As, Bs, Z),
X is Z + A* B.
third([],[],0).
有什么想法吗?您的基本案例无法访问,因为
Start
被传递给递归
未更改。因此,它永远不会与空列表统一,这意味着只使用递归的第一个子句
它看起来不像是在函数中使用的Start
,因此您可以忽略它,就像那样
recursion(_, [],[],_,[]).
或者将其全部移除,如下所示:
recursion([Tail|Tails], [Alpha|Alphas], Beta, [X|Xs]):-
second(5,Beta,Tail,X),
recursion(Tails, Alphas, Beta,Xs).
recursion([],[],_,[]).
非常感谢。我现在得到这个:T调用:(6)下一个状态递归([1,2],[1,2],[1,1],[2,2],[1,1],[2,2],[1,2],[1,2],[1,1],[2,2],[1,2],[1,1],[2,2],[1,1],[2,2],[1,1,1],[2],[1,1],[2],[2],[1,2],[u G896]错误。@user081608这在ideone()上非常有效。检查你的second/4
规则,看看发生了什么-它们需要提供X
的值,这样它就可以在上升的过程中放入[X|Xs]
。我会在上面添加我的第二个函数。你能用second(a,a,C,C)替换second的中间子句吗。我用更多信息和起始位置更改了我的uptop问题。结果为false是的,您的谓词查询(不是函数)失败并产生false。您希望得到什么结果?它应该返回一个列表。第二个为列表返回1、-1或C。第三个将一个值返回给第二个,然后进行比较。我可以看到second
的作用。递归
应该做什么?我可以看到它返回一个列表,但是在什么条件下?什么的列表?递归是用来创建输出列表的列表。例如,这可能看起来像[1,-1]。
recursion([Tail|Tails], [Alpha|Alphas], Beta, [X|Xs]):-
second(5,Beta,Tail,X),
recursion(Tails, Alphas, Beta,Xs).
recursion([],[],_,[]).