[英]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.