gpt4 book ai didi

list - 重复结果存储在Prolog中的列表中

转载 作者:行者123 更新时间:2023-12-03 07:40:48 25 4
gpt4 key购买 nike

我正在尝试创建一个Prolog程序来解决递归方程:

f(1)=2, f(2)=5, f(n)=f(n-1)+2*f(n-2)



我使用下面的rec函数进行管理,但是当我想将结果存储在列表中时(通过函数recList),我遇到了麻烦。
这是我的实现:
rec(1,2).
rec(2,5).
rec(X,N) :- X1 is X-1, X2 is X-2, rec(X1,N1), rec(X2,N2), N is N1+2*N2.

recList(0,[]).
recList(X,[N|L]) :- rec(X,N), X1 is X-1, recList(X1,L).

我的recList实现可以通过第一个值来调用它
?- recList(4,X). 

->
X = [19, 9, 5, 2] .

但是如果第二个元素长于两个元素,则不会这样:
?- rekurList(X,[2]).
X = 1 .

?- rekurList(X,[5,2]).
X = 2 .

?- rekurList(X,[9,5,2]).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [9] rec(_12587334,9)
ERROR: [8] rekurList(_12587360,[9,5|...]) at /locaiton/rec.pl:6
ERROR: [7] <user>

请问怎么了?

最佳答案

谓词is/2失败,因为is/2将右侧结构评估为算术表达式。如果它不是有效的算术表达式或数字,则is/2失败。所以当你打电话

recList(X, [19, 9, 5, 2]).

您得到 rec/2: Arguments are not sufficiently instantiated。如果运行跟踪程序(在SWISH,即SWI行: trace, recList(X, [19, 9, 5, 2]).,在ECLiPSe中,您可以使用 tkeclipse Tools->Tracer),您将得到类似以下内容的信息:
Call:recList(_13806, [19, 9, 5, 2])
Call:rec(_13806, 19)
Call:_14048 is _13806+-1
Exception:_14102 is _13806+-1
is/2: Arguments are not sufficiently instantiated

为了解决这个问题,您可以通过这种方式使用 clpfd库(我使用SWI编写了解决方案):
:- use_module(library(clpfd)).

rec(1,2).
rec(2,5).
rec(X,N):-
X1 #> 0,
X1 #= X-1,
rec(X1,N1),
X2 #> 0,
X2 #= X-2,
rec(X2,N2),
N #= N1+2*N2, !. %notice the cut (!)

recList(0,[]):-!.
recList(X,[N|L]):-
rec(X,N),
X1 #= X-1,
recList(X1,L).

查询:
?- recList(X, [19, 9, 5, 2]).
X = 4.
false.

?- recList(4,L).
L = [19, 9, 5, 2]
false

请注意,需要剪切 !,因为否则,在第一个解决方案之后,如果单击更多,则计算将永远不会结束。此外,还需要 X1 #> 0X2 #> 0,因为否则会出现 out of local stack错误。

关于list - 重复结果存储在Prolog中的列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48063040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com