2016-11-27 16 views
1

1からNの要素を生成し、リストに保存してそれらの要素を追加するプログラムを作りたいと思います。 Nはリストの長さに依存します。私が尋ねるとき例えば、「(L、A)を追加」、それはそれはVARと述語の間で動作するはずです私にリストからの要素の追加

"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. 

を与える必要があります。これまでのコードは

add(L,A) :- 
    var(L), 
    length(L,N), 
    between(1,N,E), 
    add(E,AZ), 
    A is E + AZ. 

ありがとうございます!この答えはいくつかの問題を持っていることを

:- use_module(library(clpfd)). 

add(L, A) :- 
    length(L, Length), 
    L ins 1..Length, 
    sum(L, #=, A), 
    label(L). 

注:

答えて

2

はここlibrary(clpfd)を使用したソリューションです。たとえば:

?- add(L,3). 
L = [1, 2] ; 
L = [2, 1] ; 
L = [1, 1, 1] ; 
<infinite loop>

これは大きすぎる長を試みるであろうlength/2によるものです。 LengthA以下でなければならないという制約を追加しても、この問題は解決されません。

これを修正すると、述語がはるかに読みにくくなります。一時的な修正は、Aが変数であるか、またはLがそうでないかのいずれかを指定し、それ以外の場合は例外をスローすることです。

関連する問題