2017-05-18 9 views
-1

私は2つのリストを含むリストを持っています:最初のリストはリストのリストであり、2番目のリストは同じものです。私は、3つの要素を持つタプルを含むリストのリストを作成したいと思います。これは私の最初のリストである:プロローグ内のリストのリスト

[ [ [1 2 3 4 a], [aa, bb], R1], [[ 1 3 4 5 b], [X, Y] , R2]] , [anything]] 

私はこのリストを取得したい:

[[a, [aa, bb], R1], [b, [x, y], R2]] 

どのように私は私のプロローグでは、上記のリストを返すように述語を実装することができますか?私はこれを試しました:

get_game_tiles([[[_,_,_,_,I],[X,Y],R]|Tail], [[Elem1,Elem2|Tail]]) :- 
    findall(S, 
     ( member(S,[[[_,_,_,_,S], [X,Y], R], [[_,[_]]]]), S = I), 
     [[Elem1,_|_]]), 
    findall([A,B], 
     ( member([A,B] ,[[[_,_,_,_,S], [A,B], R], [[_,[_]]]]), 
      A = X, B = Y 
     ) , 
     [[_,Elem2|_]]), 
    findall(Z, 
     ( member(Z ,[[[_,_,_,_,S], [A,B], Z], [[_,[_]]]]), 
      Z = R 
     ), 
     [[_,_|Tail]]). 
+1

Prologには*機能*がありません。 *述語*は同じものではありません。 '[1 2 3 4 a]'と '[1 2 3 4 5 b]'は有効なリストではありません。また、あなたが試したことを示して、より具体的な質問をしてください。 – lurker

+0

変数**は必ず開始してください。大文字 – CapelliC

+0

'(1 2 3 4 a)'を 'a'と' [1 3 4 5 b] 'にマップするための規則についてはまだ説明が必要です'b'。最後の要素を選択するだけですか? '[aa、bb]'と '[X、Y]'の扱いを異なるものにするためには何が必要ですか?あなたがしようとしていることは、少し不明です。ソリューションを試してみるとどうなりますか(結果はどうなりますか) – lurker

答えて

2

findallのあなたの解決策は非常にオーバーされています。次のようないくつかの問題があります:

member(S,[[[_,_,_,_,S], [X,Y], R], [[_,[_]]]]) 

member(Z ,[[[_,_,_,_,S], [A,B], Z], [[_,[_]]]]) 

これらは、環状用語です。 Sがリストのメンバーであるかどうかを照会しています([[[_,_,_,_,S], [X,Y], R], [[_,[_]]]])。 Sは、Sがのメンバーであるかどうかを尋ねるリストの要素内の用語に組み込まれています。同様に、Zがリストのメンバーであるかどうか尋ねています([[[_,_,_,_,S], [A,B], Z], [[_,[_]]]])。 Zは、あなたが質問しているリストの要素内の用語に埋め込まれています(Zがのメンバーである場合)。

member([A,B] ,[[[_,_,_,_,S], [A,B], R], [[_,[_]]]]) 

これはあまり問題ではありませんが、リストは[A,B](二つの要素のリスト)と一致どちらも次の要素で構成されて以来、常にfalseとなります。

[[_,_,_,_,S], [A,B], R] % a list of three elements 
[[_, [_]]]    % a list of one element ([_, [_]]) 

と仮定すると、私はあなたの問題の条件を理解しています(私は100%確信していません)。Prologのアプローチは、実際にははるかに簡単です:

get_game_tiles([], []).    % Empty list maps to empty list 
get_game_tiles([S|_], []) :-  % List starting with non-matching pattern results in 
    S \= [[_,_,_,_,_], [_,_], _]]. % empty and ends recursion 
get_game_tiles([[[_,_,_,_,X], [A,B], R]]|T], [[X, [A,B], R]|TR]) :- 
    get_game_tiles(T, TR). 
関連する問題