prolog中的列表列表

时间:2017-05-18 10:27:37

标签: list 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]]

如何实现谓词以在prolog中返回上面的列表?我试过这个:

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 个答案:

答案 0 :(得分: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 ([_, [_]])

假设我理解你的问题的条件(我还不确定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).