我想创建一个程序,它生成从1到N的元素,将它们保存在列表中并添加它们。 N取决于列表的长度。例如,当我要求“添加(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和谓词之间起作用。到目前为止我的代码是:
add(L,A) :-
var(L),
length(L,N),
between(1,N,E),
add(E,AZ),
A is E + AZ.
提前致谢!
答案 0 :(得分:2)
以下是使用library(clpfd)
的解决方案:
:- use_module(library(clpfd)).
add(L, A) :-
length(L, Length),
L ins 1..Length,
sum(L, #=, A),
label(L).
请注意,这个答案有一些问题。例如:
?- add(L,3). L = [1, 2] ; L = [2, 1] ; L = [1, 1, 1] ; <infinite loop>
这是由于length/2
将会尝试太大的长度。添加Length
必须小于或等于A
的约束无法解决此问题。
修复此问题会使谓词的可读性降低。临时修复可能是强加A
是变量或L
不是变量,否则抛出异常。