PROLOG展开列表 [英] Prolog flatten list

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

问题描述

flatten([A|B],R):- (islist(A)->(flatten(A,R1),R=R1);(write(A),append([A],R1,R))), flatten(B,R1).
    flatten(X,X).
    islist([_|_]).

这是我写的代码,但我有奇怪的问题..

我得到

257 ?- flatten([1,[],2,[3],[3,[3,5]]],R).
1[]23335335
R = [1, [], 2, [3], [3, [3, 5]]] .
虽然WRITE中的数字不是列表,但它们被附加为列表:s...

推荐答案

您对Flatten/2的定义中有一些错误:

您的第一个子句将失败,因为如果A是一个列表,它将首先使用R实例化R1,然后尝试再次使用Flatten(B,R1)将其统一。

展平(X,X)。->此子句按原样保留列表,不进行任何展平。

检查此其他实现:

flatten(List, Flattened):-
  flatten(List, [], Flattened).

flatten([], Flattened, Flattened).
flatten([Item|Tail], L, Flattened):-
  flatten(Item, L1, Flattened),
  flatten(Tail, L, L1).
flatten(Item, Flattened, [Item|Flattened]):-
  + is_list(Item).

这里我们使用两个谓词:Flat ten/2和Flat ten/3。‘work’将在Flat ten/3中完成,其中第二个参数将保存中间的展平列表。

第一个子句是基本情况:当我们到达空列表时,我们就完成了,所以我们用中间的展平列表实例化第三个参数。

第二个子句处理递归。它将拼合列表中的第一项(无论它是项还是子列表),并继续输入列表的其余部分。

最后一个子句是非列表项的基本情况。它将该项置于中间展平列表的开头,但它只对不是列表的项执行此操作,因为第二个子句中已注意到这种情况。

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

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