拼合列表 [英] Flattening a list

查看:56
本文介绍了拼合列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试通过 http://来解决练习07 www.ic.unicamp.br/~meidanis/courses/mc336/2009s2/prolog/problemas/

我从一个简单的迭代开始,如下所示:

I've started with a single iteration which looks like following

my_flatten1([], []).
my_flatten1([[A|T]|U], [A|V]) :-
   append(T, U1, V),
   my_flatten1(U, U1).
my_flatten1([A|T], [A|U]) :-
   not(is_list(A)),
   my_flatten1(T, U).

is_flat(A) :-
   my_flatten1(A, A).

对于以下一组查询似乎效果很好

it seems to work just fine for the following set of queries

my_flatten1([a, [b, [c, d], e]], X).
my_flatten1(X, [a, b, c]).
my_flatten1(X, [a|T]).
my_flatten1(X, [a, b, A]).
my_flatten1([a, X], M).
my_flatten1([a|X], M).

is_flat([a|X]).
is_flat([a,[c]|X]).
is_flat([F,[c]|X]).

my_flatten1(A, B).
my_flatten1([A], B).
my_flatten1([[A]], B).
my_flatten1([[a|A]], B).
my_flatten1([a|A], B).
my_flatten1([X|B], [1,2,3,4]).
my_flatten1([[a,c|D]|X], [a|B]).

但是我没有成功地基于my_flatten1构建my_flatten.总是有一些查询失败或以无休止的循环结束,或者仅产生一个最明显的结果.

However I wasn't successful to build my_flatten based on my_flatten1. There's always some queries that fail or end up in endless loops, or produce just one, most obvious result.

编辑以明确说明我要做什么,例如,我可以使用变量作为第一个参数调用my_flatten1以便分发括号:

Edit to clarify what I am after, for example I can call my_flatten1 with a variable as a first argument in order to distribute brackets:

?- my_flatten1(X, [a, b]).
X = [[a], [b]] ;
X = [[a], b] ;
X = [[a, b]] ;
X = [a, [b]] ;
X = [a, b].

推荐答案

我不确定您单击问题标题时是否知道99个Prolog问题包含解决方案?

I'm not sure if you are aware that the 99 Prolog problems contain solutions when you click on the problem title?

无论如何,my_flatten的外观例如如下:

Anyways, my_flatten looks, for example, like following:

my_flatten(X,[X]) :- \+ is_list(X).
my_flatten([],[]).
my_flatten([H|T],R) :-
    my_flatten(H,HFlat),
    my_flatten(T,TFlat),
    append(HFlat,TFlat,R).

一些查询:

?- my_flatten([[]],R).
   R = [].

?- my_flatten([[1],[2]],R).
   R = [1, 2].

?- my_flatten([[1],[[3]]],R).
   R = [1, 3].

编辑

@ lambda.xy.y正确观察到,以上版本的查询不会终止:

As correctly observed by @lambda.xy.y, above version does not terminate for the query:

?- my_flatten(X,[X]).

所以我看了SWI内置的flatten/2的行为并观察到:

So I took a look at the behaviour of SWI's built-in flatten/2 and observed:

?- flatten([],[]).
   true.

?- flatten([],X).
   X = [].

?- flatten(X,[]).
   false.

?- flatten(X,Y).
   Y = [X].

?- flatten(X,[X]).
   true.

实施:

my_flatten(L,R) :-
    my_flatten(L,[],Flat),
    !,
    R=Flat.

my_flatten(X,R,[X|R])  :- \+ is_list(X), !.
my_flatten([],R,R)     :- !.
my_flatten([H|T],A1,R) :- !,
    my_flatten(H,A2,R),
    my_flatten(T,A1,A2).
my_flatten(NonList,T,[NonList|T]).

这篇关于拼合列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆