Prolog 从列表中添加元素
我想制作一个程序,它生成从1到N的元素,将它们保存在一个列表中并进行添加。N取决于列表的长度。例如,当我要求“add(L,A)”时,它应该给我Prolog 从列表中添加元素,prolog,Prolog,我想制作一个程序,它生成从1到N的元素,将它们保存在一个列表中并进行添加。N取决于列表的长度。例如,当我要求“add(L,A)”时,它应该给我 "L=[], A=0", "L=[1], A=1", "L=[1,1], A=2", "L=[1,2], A=3", "L=[2,1], A=3", "L=[2,2], A=4", "L=[1,1,1], A=3" and so on. 它应该使用var和between谓词。到目前为止,我的代码是: add(L,A) :- var(L),
"L=[], A=0",
"L=[1], A=1",
"L=[1,1], A=2",
"L=[1,2], A=3",
"L=[2,1], A=3",
"L=[2,2], A=4",
"L=[1,1,1], A=3" and so on.
它应该使用var和between谓词。到目前为止,我的代码是:
add(L,A) :-
var(L),
length(L,N),
between(1,N,E),
add(E,AZ),
A is E + AZ.
提前谢谢 下面是一个使用
库(clpfd)
的解决方案:
注意这个答案有一些问题。例如:
?- add(L,3).
L = [1, 2] ;
L = [2, 1] ;
L = [1, 1, 1] ;
<infinite loop>
?-添加(L,3)。
L=[1,2];
L=[2,1];
L=[1,1,1];
这是因为length/2
会尝试过大的长度。添加Length
必须小于或等于a
的约束不能解决此问题
修复此问题将使谓词的可读性大大降低。临时修复方法可以是强制A
是变量或L
不是变量,否则抛出异常
?- add(L,3).
L = [1, 2] ;
L = [2, 1] ;
L = [1, 1, 1] ;
<infinite loop>