prolog中的递归和基础

时间:2014-03-08 22:51:57

标签: 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([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和Tail都是输入谓词的完全相同的列表。这就是为什么在这个例子中它们都是[1,2]。当我将基本案例更改为recursion(_,[],[],_,[]).时,我得到:

98 ?- recursion([1, 2], [1, 2], [[1, 1], [2, 2]], 0, X).
T Call: (6) recursion([1, 2], [1, 2], [[1, 1], [2, 2]], 0, _G1632)
T Redo: (6) recursion([1, 2], [1, 2], [[1, 1], [2, 2]], 0, _G1632)
T Fail: (6) recursion([1, 2], [1, 2], [[1, 1], [2, 2]], 0, _G1632)
false.

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

由于Start传递给recursion未更改,因此无法访问您的基本案例。因此,它永远不会与空列表统一,这意味着只会使用recursion的第一个子句。

看起来你的函数中没有使用Start,所以你可能会忽略它,就像那样

recursion(_, [],[],_,[]).

或完全删除它,如下所示:

recursion([Tail|Tails], [Alpha|Alphas], Beta, [X|Xs]):-
  second(5,Beta,Tail,X),
  recursion(Tails, Alphas, Beta,Xs).
recursion([],[],_,[]).