簡體   English   中英

序言中的列表列表

[英]lists of lists in prolog

我有一個包含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]]).

使用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是否Z成員的列表元素中的術語中。

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

這並不是什么大問題,但是由於列表由以下元素組成,因此始終都是錯誤的,這些元素都不匹配[A,B] (兩個元素的列表):

[[_,_,_,_,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).

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM