2017-03-29 1 views
1

まず、Prologのノブであると私を許してください。 私が達成したいすべてが という述語作成 にある - オブジェクトのための[0,1] - を(例えば3)所望の長さを考える - が与えられたの(繰り返して)すべての可能な順列を検索します長(Iは、例えば、同じオブジェクトのリストを持っている場合0、1が複数回追加することができ、何の問題を複数回追加することはできません...)Prolog:繰返しですべての可能な順列を作成する方法は、オブジェクトのリストを与える

例:

? myPermutation(3, [0,1], L). 
L = [0,0,0] 
next-> 
L = [0,0,1] 
next-> 
L = [0,1,0] 
next-> 
L = [0,1,1] 
.... 
next-> 
L = [1,1,1] 

誰か私にそれを手伝ってもらえますか? ありがとうたくさん...

ヒント:削除述語を使用して何かを考えています... [0,1]からオブジェクトを削除する可能なすべての方法について、オブジェクトリストと質問Prologを与えるようなものです。

+0

を私はその述語を持っている: デル(X、[X |テイル]、テール)。 del(X、[Y | Tail]、[Y | Tail1]): - del(X、Tail、Tail1)。 とI照会 del(X、[0,1]、_)です。 を返します。X = 0 X = 1 false バックトラック経由で返します。 私はアキュムレータ付きの述語が必要だと思います。長さを指定してdelを使って、[0,1、...、1]のリストを作成し、すべての解に戻します。 –

答えて

1

私はあなたのアプローチが少し複雑だと思います。上記の溶液は、出力リストの長さを設定するlength/2述語を使用すると、リストの各要素がメンバーであることを再帰的にちょうど繰り返し処理リストと力eval/2述語を呼び出す

eval([],_). 
eval([H|T],Set):-member(H,Set),eval(T,Set). 

myPermutation(N, Set, L):-length(L,N), eval(L,Set). 

:あなたは、単にような何かを書くことができます指定されたSet 例:

?- myPermutation(3, [0,1], L). 
L = [0, 0, 0] ; 
L = [0, 0, 1] ; 
L = [0, 1, 0] ; 
L = [0, 1, 1] ; 
L = [1, 0, 0] ; 
L = [1, 0, 1] ; 
L = [1, 1, 0] ; 
L = [1, 1, 1]. 

また、あなたのような、より一般的なクエリを作ることができます。

?- myPermutation(3, S, [0,0,1]). 
S = [0, 1|_G3426] ; 
S = [0, _G3425, 1|_G3429] ; 
S = [0, _G3425, _G3428, 1|_G3432] ; 
S = [0, _G3425, _G3428, _G3431, 1|_G3435] ; 
S = [0, _G3425, _G3428, _G3431, _G3434, 1|_G3438] . 
(and goes on...) 
+0

助けてくれてありがとう!私はこの答えを受け入れるでしょう。私が尋ねたものよりも優れています(0,1だけでなく、オブジェクトのセットを取る)。 –

+0

喜んで助けてください! – coder

関連する問題