2016-04-12 3 views
0

との間のすべての整数のリストを生成します。作品のclpfd - 私はclpfd 5と10の間のすべての異なる整数のリストを生成取得するSWI-Prologので働いて5と10

q1(Answer) :- 
    length(Xs, Answer), 
    Xs ins 0..20, 
    chain(Xs, #<), 
    maplist(q1constraints, Xs). 

q1constraints(X) :- 
    X #>= 5, 
    X #=< 10. 

種類を、しかし、 ...、長さ0、1のそれぞれの解を生成する6、その後、長さ7のソリューションを求めているハング:

?- q1(Answer). 
Answer = 0 ; 
Answer = 1 ; 
Answer = 2 ; 
Answer = 3 ; 
Answer = 4 ; 
Answer = 5 ; 
Answer = 6 ; 
<hangs> 

満足すべて整数のリストを生成するための良い方法はあります希望の制約?ここで

+0

リスト?または、バックトラッキングで生成しますか?そして、あなたは「別れた」という意味はどういう意味ですか?なぜ「長さ/ 2」ですか?なぜ 'ins 0..20'ですか?私はあなたが何をしようとしているのかを説明していないと感じています。 –

+0

私は制約から、リスト[5,6,7,8,9,10]を生成し、そこにいくつの要素があるのか​​を数えたいと思います。制約条件はもっと豊富かもしれません。たとえば、「偶数」制約のフォームを追加したい場合があります。「X mod 2#= 0」が生成され、[6、8、10]が生成されます。リスト演算子はもっと豊富かもしれません。例えば、 "count"の代わりに "sum"と言ってもいいかもしれません。 –

+0

PS。私は[5、5、5、5、5、6]のようなリストは気にしません。 –

答えて

2

は、あなたのプログラムが何をするかです:

  1. は、リストの各要素Xについては、空のリスト
  2. で始まる、増加の長さのリストを生成し、Xは[0であるという制約をもたらします、 20]
  3. 値が厳密に増加するという制約があります。
  4. リスト内の各要素について、Xが[5、10]であるという追加の制約があります。

次に、生成されたリストの長さを問い合わせます。

[0、20]と[5,10]:5,6,7,8,9,10の6つの値があります。最初に生成する空のリストについては、制約のない変数はありません。 1つの変数を持つリストの場合、6つの可能な値がありますが、リストの長さについてのみこれらの値を要求しません。 2つの変数を持つリストの場合は、{5,6}、{6,7}、...、{9,10}の5つの組み合わせが可能ですが、もう一度、それらを求めません。リストの長さ。

最終的には、7つの値で一覧表示されます。各要素には6つの値しかないので、解決策はありません。

あなたの目標はここですか?たぶんあなたはよりよく説明しようとするべきです。バックトラッキングによって5と10の間のすべての値を取得するには、between(5, 10, X)、またはCLPFDでX in 5..10, label([X])と言うことができます。それ以外の場合は、質問を書き直す必要があります。

3

あなたの質問は私には分かりません。しかし、私は試してみます:

これらの要素では、最初にリストの長さを固定する必要があります。それ以外の場合:実際には

?- length(Xs,N), Xs ins 5..10, chain(Xs, #<), Xs = [5|_], last(Xs, 10). 
Xs = [5, 10], N = 2 ; 
Xs = [5, _A, 10], N = 3, _G7292 in 6..9 ; 
Xs = [5, _A, _B, 10], N = 4, _A in 6..8,_A#=<_B+ -1,_B in 7..9 ; 
Xs = [5, _A, _B, _C, 10], N = 5, _A in 6..7, _A#=<_B+ -1, _B in 7..8,_B#=<_C+ -1, _C in 8..9 ; 
Xs = [5, 6, 7, 8, 9, 10], N = 6 ; 
** LOOPS ** 

は、さえ(ins)/2は必要ありません。

?- length(Xs,6), chain(Xs, #<), Xs = [5|_], last(Xs, 10). 
Xs = [5, 6, 7, 8, 9, 10]. 
+0

お返事ありがとうございます。問題は、文字通り "正の整数(偶数)が5と10の間にどれくらいあるか"です。入力として長さを渡すことは目的を敗北させます:私はそれを少し面白くするために "even"述語を追加しました。 –

関連する問題