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). 

不过,请注意,因为我们使用>/2is-/2,即算术,我们防止序言使用此谓词有几种方式,如:

?- duple1(X, Y, [xyz, xyz]). 
X = 2, 
Y = xyz. 

这个以前工作过,在我们的第一个谓词中!

希望这有一些帮助。

+0

长度+ maplist是要走的路... – CapelliC 2012-03-28 20:18:55

我想你打电话给你的谓词,例如,以这样的方式

?- 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]. 
+0

感谢帮助了很多,我还不擅长与prolog合作。 – Dommol 2012-03-28 19:53:40