添加列表中的元素

时间:2016-11-27 15:28:56

标签: prolog

我想创建一个程序,它生成从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.

提前致谢!

1 个答案:

答案 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不是变量,否则抛出异常。