2017-05-18 63 views
-1

我有一個列表,其中包含2個列表:第一個列表和第二個列表相同。我想列出一個包含三個元素的元組的列表。這是我的初步名單:序言列表中的列表

[ [ [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](兩個元素的列表)的:

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

假設我理解你的問題的條件(我還沒有確信我的確如此),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).