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