我是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的工作方式是通过术语的统一。你不能"返回" A就像在程序语言中那样",所以我猜测我的谓词中的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我想要谓词返回。
答案 0 :(得分: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] .