2016-04-04 6 views
1

私は論理的な制約を使用して、次の問題を解決しようとしている「引数が十分にインスタンス化されていない」:は、エラーをスロー

パッカーが長い大型トラック上に5箱を設置しなければなりません。ニワトリ、オオムギ、キツネ、ラット毒および小麦を含む5つの塊 。箱は の間に隙間のない長い線で配置する必要があります。

•ニワトリはキツネから切り離されています。

•ラット毒は大麦の隣にはない。

•ラット毒は小麦の隣にはない。

これらのクレートを配置する方法が異なる場合は、 これらの梱包上の制約があります。

:- use_module(library(clpfd)). 

position(Crates) :- 
    Crates = [Chicken, Barley, Foxes, RatPoison, Wheat], 
    Regions ins 1..5, 
    Chicken #\= Foxes, 
    RatPoison #\= Barley, 
    RatPoison #\= Wheat, 
    labeling([], Regions). 

それは私がそれを実行しようとすると、エラー「引数は十分にインスタンス化されていない」スロー:

は、これは私がこれまで持っているものです。

私は非常にプロローグに新しいので、任意の助けに感謝します。

+2

'[Regions] ins 1..5'と' labeling([]、[Regions])を試してください。 'ins'と' labeling'に関するCLPFDのドキュメントを読んでください。 – lurker

答えて

2

まず、Regions1..5に制限し、それにラベルを付けることにします。しかし、あなたは5つの箱のための可能な位置を知りたい。制限し、Cratesというラベルを付けてください。 Regionsは、1から5までの値に制限し、リストの長さをRegionsに制限すると、自由変数であることに注意してください。したがって、ラベル付けしようとするとエラーが発生します。このバージョンでは、述語位置/ 1の最後の目標では、リストCratesは既に固定長(= 5)に制限されており、ラベル付けされると1〜5の値に制限されています。

次に、チキンとキツネを同じ箱に入れないようにします:Chicken #\= Foxes。しかし、タスクの説明によれば、彼らはとにかく別の箱に入っています。あなたはむしろ、それらを隣接する箱に入れないようにします。同じことがラトポイズン/オオムギとラットウイーソン/小麦にも当てはまります。同じ位置に2つのクレートを入れることもできません。そのためにはall_distinct/1フォームライブラリ(clpfd)を使用できます。すべて一緒にこれを置くことは、あなたが何かを得る:

:- use_module(library(clpfd)). 

position(Crates) :- 
    Crates = [Chicken, Barley, Foxes, RatPoison, Wheat], 
    Crates ins 1..5, 
    all_distinct(Crates), 
    not_adjacent(Chicken,Foxes), 
    not_adjacent(RatPoison,Barley), 
    not_adjacent(RatPoison,Wheat), 
    labeling([], Crates). 

not_adjacent(X,Y) :- 
    X #\= Y+1, 
    Y #\= X+1. 

を今の位置/ 1照会しよう:あなたはすべてのソリューションを通過したくない場合は対話的にあなたがのfindAll/3を使用することができます

?- position(Crates). 
Crates = [1,2,4,5,3] ? ; 
Crates = [1,3,4,5,2] ? ; 
Crates = [1,4,3,2,5] ? 
... 

をし、長さ/ 2を指定すると、すべての解を表示して数えます。

?- findall(Crates,position(Crates),L),length(L,X). 
L = [[1,2,4,5,3],[1,3,4,5,2],[1,4,3,2,5],[1,5,3,2,4],[2,1,4,3,5],[2,1,4,5,3],[2,3,4,1,5],[2,3,4,5,1],[2,3,5,1,4],[2,4,5,1,3],[2,5,4,1,3],[2,5,4,3,1],[3,1,5,4,2],[3,2,5,4,1],[3,4,1,2,5],[3,5,1,2,4],[4,1,2,3,5],[4,1,2,5,3],[4,2,1,5,3],[4,3,1,5,2],[4,3,2,1,5],[4,3,2,5,1],[4,5,2,1,3],[4,5,2,3,1],[5,1,3,4,2],[5,2,3,4,1],[5,3,2,1,4],[5,4,2,1,3]], 
X = 28 
+0

どうもありがとうございます、それは非常に役に立ちます! – AgarAgar

1

マイモデルでは異なる結果が得られます。たぶん私は完全に私はとにかく

abs(Chicken - Foxes) #> 2 

のように翻訳し

鶏が狐

から分離されているフレーズ、フルモデル

position(Crates) :- 
    Crates = [Chicken, Barley, Foxes, RatPoison, Wheat], 
    all_different(Crates), 
    Crates ins 1..5, 
    abs(Chicken - Foxes) #> 2, 
    abs(RatPoison - Barley) #> 1, 
    abs(RatPoison - Wheat) #> 1, 
    label(Crates). 
を理解していません

収量

?- aggregate(count,Cs^position(Cs),N). 
N = 8. 
+2

チキンがクレート3に入っていて、キツネがクレート1(例えば[3,4,1,2,5])にある場合、それらは明確に分かれていますが、クレートは "長い行に配置"されていますが、 Foxes)#> 2は3-1 = 2として失敗する。 'abs(Chicken - Foxes)#> 1 'バージョンでは私のものと同じ結果になります;-) – tas

+0

確かに、'言語的罠 'になる可能性があります。違った表現をする目的がわからなかった。 – CapelliC

+0

私は、問題文が、特に "キツネ"と "鶏"になると、やや誤解を招くと感じています... IMOには正確に1つのキツネとちょうど1つのキツネがあります。 – repeat

関連する問題