Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 从列表中添加元素_Prolog - Fatal编程技术网

Prolog 从列表中添加元素

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

我想制作一个程序,它生成从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),
    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>