2013-05-09 59 views
1

我是Prolog的新手,试图做一个辅助函数,该函数从列表中取2个元素,并创建一个向量。 例如:PROLOG谓词回答真或假,但不是所需的值

L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L). L = [0,1,3,0,0,0,0,0] .

它应该是这样的,但即时得到这样的:

?- L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L). 
L = [0, 0, 0, 0, 0, 0, 0, 0] . 

我的代码是:

replace([_|T], 0, X, [X|T]). 
replace([H|T], I, X, [H|R]):- I > 0, I1 is I-1, replace(T, I1, X, R). 

v_form([],R). 
v_form([X,Y|Z],R) :- replace(R,X,Y,K), v_form(Z,K). 

我发现这个“A没有被统一任何规则中的任何内容,Prolog的工作方式是通过术语的统一,你不能像程序语言那样“返回”,所以即时通讯咝声中的R我的谓语不被统一,但如果多数民众赞成的情况下,我不明白为什么我得到的期望值,当我改变 v_form([],R).v_form([],R).:- write(R). 我得到:

?- L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L). 
[0,1,3,0,0,0,0,0] 
L = [0, 0, 0, 0, 0, 0, 0, 0] 

所以,如果真的,我没有统一R,为什么wrtie(R)不会抛出一个错误/异常/打印[] /告诉我它不是统一的,或者这些行之间的东西,而是写R我想谓词返回。

回答

1

您正在'返回'K而不是R,并且必须添加另一个输出参数,因为在Prolog中您不能'重新分配'一个变量。这就是你引用的陈述的意思。

尝试

v_form([],R,R). 
v_form([X,Y|Z],I,R) :- replace(I,X,Y,K), v_form(Z,K,R). 

?- L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L,R). 
L = [0, 0, 0, 0, 0, 0, 0, 0], 
R = [0, 1, 3, 0, 0, 0, 0, 0] . 
+0

THX,不知道关于 “不能 '重新分配' 变量” – 2013-05-09 05:44:32