繁体   English   中英

在Prolog中压缩列表列表

[英]flatten a list of lists in Prolog

我有这个列表清单:

 L = [[[a,b],[d,e]],[[m,f],[p,o]],[[r,l],[v,d]]].

我想用Prolog编写一个函数,它以一种变为这样的方式展平它:

 L = [[a,b],[c,d],[m,f],[p,o],[r,l],[v,d]].

有什么建议么? 谢谢。

使用谓词append/2

?- L = [[[a,b],[d,e]],[[m,f],[p,o]],[[r,l],[v,d]]], append(L, R).
L = [[[a, b], [d, e]], [[m, f], [p, o]], [[r, l], [v, d]]],
R = [[a, b], [d, e], [m, f], [p, o], [r, l], [v, d]].

您应该查看SWI-Prolog的实现,并在需要时复制它。 如果必须在GNU-Prolog中执行,请省略must_be/2

但是如果因为findall/3而需要这个,请记住可能还有findall/4可用(不适用于GNU-Prolog,但SWI-Prolog有它):

$ swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.2-25-gf8c39d8)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- findall(X, between(1,3,X), Xs, Rest), findall(Y, between(7,11,Y), Rest).
Xs = [1, 2, 3, 7, 8, 9, 10, 11],
Rest = [7, 8, 9, 10, 11].

几乎所有需要压缩列表的情况都可以使用差异列表来避免。

possible_moves(Tray,PossibleMoves):-
    findall([J,1,X,Y],possible_move(Tray,[J,1,X,Y]),T1),
    findall([J,2,X,Y],possible_move(Tray,[J,2,X,Y]),T2),
    append(T1,T2,Res),
    findall([J,3,X,Y],possible_move(Tray,[J,3,X,Y]),T3),
    append(Res,T3,PossibleMoves).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM