まず、Regions
を1..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
'[Regions] ins 1..5'と' labeling([]、[Regions])を試してください。 'ins'と' labeling'に関するCLPFDのドキュメントを読んでください。 – lurker