2016-06-17 3 views
1

私は可能な限りすべての組み合わせを生成しようとしています。すべての[X、Y]の組み合わせが可能になりたい。ここ
は例です:与えられたリストのすべての[X、Y]をどのように生成するのですか?

?- arguments(A,[1,2,3]). 
A = [1,2] ; A = [1,3] ; A = [2,1] ; A = [2,3] ; A = [3,1] ; 
A = [3,2] 

は、私は複数のものを試してみましたが、私は働くものを見つけるしたことはありません。 私はアイデアのようなすべての可能性を試してプロローグの機能を使用することであるかなり確信している:

element(X,[X|_],1). 
element(X,[_|Q],N) :- element(X,Q,NewN), N is NewN + 1. 

この述語は、位置Nにある要素を返し、または要素のXの位置を返す、またはすべての可能性を生成することができます。例:

?- element(X,[a,b,c],N). 
N = 1 
X = a 

N = 2 
X = b 

N = 3 
X = c 

ありがとうございました。 gusbro答え、次の

編集:私はすでに既存の述語を使用することはできません
は、それは当然の一部です。
は あなたの答えを読んで、私はこの思い付いた:

remove_element_x(X, [X|Q], Q). 
remove_element_x(X, [T|Q], [T|Res]) :- remove_element_x(X,Q,Res). 

arguments([X,Y],L) :- 
    element(X,L,_), 
    remove_element_x(X,L,L2), 
    element(Y,L2,_). 

remove_element_x/3は、リストから要素xを削除し、新しいリストを返します。 しかし、バックトラックが動作していない:

?- arguments(A,[1,2,3]). 
A = [1,2] ? 
yes 

答えて

2

あなたはリストから要素を選択します(残りのリストを取得)するselect/3を使用することができ、その後、)残りのリストから別の要素を選択するために、再びそれを行います。

すなわち:

arguments([A,B], L):- 
    select(A, L, L1), 
    select(B, L1,_). 

テストケース:

?- arguments(A,[1,2,3]). 
A = [1, 2] ; 
A = [1, 3] ; 
A = [2, 1] ; 
A = [2, 3] ; 
A = [3, 1] ; 
A = [3, 2] 
+0

入力いただきありがとうございます。 – Chuck

+0

@Chuck: 'listing(select/3) 'を照会して' select/3'の実装を見ることができます。 – gusbro

+0

チップをありがとう。問題が解決しました ! – Chuck

関連する問題