Prolog中复发

时间:2017-01-04 13:45:15

标签: prolog

我即将在Prolog中创建程序,该程序返回重复的值列表:

f(1) = 3, f(2) = 2, f(n) = f(n-1) * f(n-2)

E.g

 rekur(5, S). -> S = [3, 2, 6, 12, 72]

我试图用以下方法解决它:

rekur(2,[3,2]).
rekur(X,[H|T,M]):- X1 is X-1, rekur(X1,[H1,T1,M1], H1 is T*M.

这被证明是完全错误的。你能为这个例子演示解决方案吗?该解释非常感谢。我发现我不知道Prolog是如何工作的。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

一个主要问题可能是[H|T,M]不是有效列表。事实上,Prolog中的列表看起来像大多数程序员认为的链表:它是一个元组,包含对元素的引用(称为 head )和对下一元组的引用(称为)。有一个特殊列表[],表示列表的结尾。 [3,2]只是[3|[2|[]]]的语法糖,实际上[](3,[](2,[]))的格式很好。

由于这个链表概念,你不能(在语法上也不能在 O(1)上访问最后的元素)。

这就是为什么Prolog通常以相反的方式工作:你生成列表的头部,并通过使用递归,列表的其余部分被正确填充。对于rekur/2子句,您可以使用两个累加器AB以某种方式存储将在列表中发出的下一个元素。此外,您使用N(要生成的列表的长度)作为循环计数器。例如:

rekur(N,L) :-
    rekur(N,3,2,L).

rekur(N,_,_,[]) :-
    N <= 0,
    !.
rekur(N,A,B,[A|T]) :-
    N > 0,
    C is A*B,
    N1 is N-1,
    rekur(N1,B,C,T).