list - 扁平化列表

标签 list prolog

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

我从一个看起来像下面的迭代开始

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).

对于以下一组查询,它似乎工作得很好
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_flatten基于 my_flatten1 .总会有一些查询失败或陷入无限循环,或者只产生一个最明显的结果。

编辑以澄清我所追求的,例如我可以调用 my_flatten1将变量作为第一个参数以分配括号:
?- my_flatten1(X, [a, b]).
X = [[a], [b]] ;
X = [[a], b] ;
X = [[a, b]] ;
X = [a, [b]] ;
X = [a, b].

最佳答案

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

无论如何,my_flatten看起来,例如,如下所示:

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 正确观察到的那样,上述版本不会因查询而终止:
?- my_flatten(X,[X]).

所以我看了一下 SWI 的内置 flatten/2 的行为。并观察到:
?- 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]).

关于list - 扁平化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38482311/

相关文章:

android - Hello 的问题, View : List View tutorial

python - 为什么 Python 给出 ['th' 、 'th' 、 'th' 、 'th' 、 'th' ] 作为 '5 * [' th']' 的结果而不是五个列表?

用于完成字符串的 Prolog 通配符

prolog - 如果标签大于 0,Gerrit 允许提交(序言规则)

javascript - AngularJS 显示数组中的列表

java - 是否有 Java 的 Collections.synchronizedList 的 Kotlin 等价物?或者这在 Kotlin 中是不需要的

Python:随机混合两个列表

prolog - 为什么我在 Prolog 中的 pi 上出现类型错误?

list - 序言检查表

list - 在 Prolog 中按索引从 i 到 j 获取原子列表