2017-01-22 1 views
0

私は、次の述語があります。Prologで出力をソートする方法は?

soln(L,M,O,R,S,V) :- 
    permutation([L,M,O,R,S,V],[1,2,3,4,5,6]), 
    R=\=S+1, 
    R=\=S-1, 
    M=:=L+1, 
    O>M, 
    O<S. 

私はREPLからそれを呼び出すと、それが正しい答えを出力します:

?- soln(L,M,O,R,S,V). 
L = 1, 
M = 2, 
O = 3, 
R = 4, 
S = 6, 
V = 5 ; 
L = 1, 
M = 2, 
O = 3, 
R = 6, 
S = 4, 
V = 5 . 

しかし、私には多くの有用な変数がソートされて出力されますがその価値に応じて前の例を使用するには、[L,M,O,R,V,S], [L,M,O,S,V,R], ...のようなものが理想的でしょう。

私はこれをREPLとスタンドアロンスクリプトの両方で実行したいと考えています。

答えて

3

名前に応じて名前を並べ替える場合は、変数とその名前のの関連付けを追跡する必要があります。

変数名がソースコードに表示されているのは、Prologプログラム内でアクセスできないため、Prolog内でアクセス可能な方法で名前を追跡する必要があるためです。

のペアのリストを追跡する1つの方法は、Variable-Nameの形式です。この方法では、変数が値にバインドされているときは、依然としてその意図がわかります  です。今、私は今、変数のを名を示すためにoなど原子lmを、使用しています

 
:- use_module(library(clpfd)). 

solution(Pairs) :- 
     Vs = [L,M,O,R,S,_V], 
     Names = [l,m,o,r,s,v], 
     pairs_keys_values(Pairs, Vs, Names), 
     R #\= S+1, 
     R #\= S-1, 
     M #= L+1, 
     O #> M, 
     O #< S, 
     Vs ins 1..6. 

注意、およびI:

はしたがって、私は次のわずかな書き換えを提案します約の理由。さらに、私はこのすべてをという制約で表現する自由をとったので、それぞれの置換を試みる代わりにpropagationの制約から恩恵を受けます。制約を使用すると、Prologエンジンは を試すことなく、 スペースの検索のかなりの部分をプルーンすることができます。変数Vを表すには_Vを使用しています。なぜなら、この変数は他の場所には記述されていないため、  Vを使用すると、警告がシングル となります。

我々はすでにそれを試してみることができます:ソート名に今

 
?- solution(Pairs), 
    pairs_keys_values(Pairs, Vs, Names), 
    label(Vs). 
Pairs = [1-l, 2-m, 3-o, 1-r, 4-s, 1-v], 
Vs = [1, 2, 3, 1, 4, 1], 
Names = [l, m, o, r, s, v] ; 
Pairs = [1-l, 2-m, 3-o, 1-r, 4-s, 2-v], 
Vs = [1, 2, 3, 1, 4, 2], 
Names = [l, m, o, r, s, v] ; 
Pairs = [1-l, 2-m, 3-o, 1-r, 4-s, 3-v], 
Vs = [1, 2, 3, 1, 4, 3], 
Names = [l, m, o, r, s, v] ; 
etc. 

を、これらの変数の値に応じて、ペアをソートISO  述語keysort/2を、使用して彼らの  キーに従って、すなわちその最初の コンポーネント:

 
?- solution(Pairs0), 
    pairs_keys_values(Pairs0, Vs0, Names0), 
    label(Vs0), 
    keysort(Pairs0, Pairs), 
    pairs_values(Pairs, Names). 
Pairs0 = [1-l, 2-m, 3-o, 1-r, 4-s, 1-v], 
Vs0 = [1, 2, 3, 1, 4, 1], 
Names0 = [l, m, o, r, s, v], 
Pairs = [1-l, 1-r, 1-v, 2-m, 3-o, 4-s], 
Names = [l, r, v, m, o, s] ; 
Pairs0 = [1-l, 2-m, 3-o, 1-r, 4-s, 2-v], 
Vs0 = [1, 2, 3, 1, 4, 2], 
Names0 = [l, m, o, r, s, v], 
Pairs = [1-l, 1-r, 2-m, 2-v, 3-o, 4-s], 
Names = [l, r, m, v, o, s] ; 
Pairs0 = [1-l, 2-m, 3-o, 1-r, 4-s, 3-v], 
Vs0 = [1, 2, 3, 1, 4, 3], 
Names0 = [l, m, o, r, s, v], 
Pairs = [1-l, 1-r, 2-m, 3-o, 3-v, 4-s], 
Names = [l, r, m, o, v, s] ; 
Pairs0 = [1-l, 2-m, 3-o, 1-r, 4-s, 4-v], 
Vs0 = [1, 2, 3, 1, 4, 4], 
Names0 = [l, m, o, r, s, v], 
Pairs = [1-l, 1-r, 2-m, 3-o, 4-s, 4-v], 
Names = [l, r, m, o, s, v] ; 
etc. 
関連する問題