Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion prolog中的递归和basecase_Recursion_Prolog - Fatal编程技术网

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([],[],_,[]).