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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重复结果存储在Prolog的列表中相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个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]).

你得到qazxsw poi。如果你运行跟踪器(在SWISH中,这是SWI在线:qazxsw poi在ECLiPSe中你可以使用rec/2: Arguments are not sufficiently instantiated)你得到类似的东西:

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

要解决这个问题,你可以用这种方式使用库tkeclipse Tools->Tracer(我用SWI编写了解决方案):

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

请注意,需要剪切:- 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 #> 0错误。

以上是关于重复结果存储在Prolog的列表中的主要内容,如果未能解决你的问题,请参考以下文章

Prolog中的展平列表[重复]

python中如何删除列表中重复的元素

Prolog - 确定列表中重复的数量并将数量转换为指数

Prolog 通配符:重复列表而不更改通配符值

NSURLErrorDomain 中代码的含义是啥?

javascript--函数的声明及调用/JS中代码执行顺序