prolog函数返回内存位置而不是值
刚开始使用prolog编程时,我遇到了一些问题。我所拥有的函数应该取值为X并将其复制N次。我的函数返回N个内存位置的列表。这是代码,任何想法?prolog函数返回内存位置而不是值
duple(N,_,M):- length(M,Q), N is Q.
duple(N,X,M):- append(X,M,Q), duple(N,X,Q).
这些都不是内存不会忽略。那些是*变量。你所看到的是他们在你选择的序言系统中的内部名字。然后,正如@chac指出的(+1顺便说一句),第三个条款是没有意义的!也许你可以试着告诉我们你的意思,这样我们就可以明白如何正确地做到这一点。
我要去给你谓词的两种实现方式,试图告诉你正确的Prolog的语法:
duple1(N, X, L) :-
length(L, N),
maplist(=(X), L).
在这里,您duple1/3
谓词,我们告诉序言中所产生的名单L
的长度是N
,然后我们告诉它,L
的每个元素应该与X
统一,以使谓词成立。
另一个这样做将通过递归构建结果列表“手动”:
duple2(0, _X, []).
duple2(N, X, [X|L]) :-
N > 0,
NewN is N - 1,
duple1(NewN, X, L).
不过,请注意,因为我们使用>/2
,is
和-/2
,即算术,我们防止序言使用此谓词有几种方式,如:
?- duple1(X, Y, [xyz, xyz]).
X = 2,
Y = xyz.
这个以前工作过,在我们的第一个谓词中!
希望这有一些帮助。
我想你打电话给你的谓词,例如,以这样的方式
?- duple(3,xyz,L).
,你会得到
L = [_G289, _G292, _G295] ;
ERROR: Out of global stack
如果您尝试
?- length(X,Y).
X = [],
Y = 0 ;
X = [_G299],
Y = 1 ;
X = [_G299, _G302],
Y = 2 ;
X = [_G299, _G302, _G305],
Y = 3 ;
X = [_G299, _G302, _G305, _G308],
Y = 4 .
...
你可以看到发生了什么:
你的查询将匹配指定的*M*
,显示M个未被证实的变量列表(内存位置),然后继续回溯并生成更长的列表,直到有堆栈空间。你的第二条规则永远不会开火(我不明白它的目的)。
发电机是更容易这样写:
duple(N,X,M) :- findall(X,between(1,N,_),M).
测试:
?- duple(3,xyz,L).
L = [xyz, xyz, xyz].
感谢帮助了很多,我还不擅长与prolog合作。 – Dommol 2012-03-28 19:53:40
长度+ maplist是要走的路... – CapelliC 2012-03-28 20:18:55