在 Prolog 中展平列表

问题描述 投票:0回答:1

我对 Prolog 相当陌生,正在尝试练习压平列表。我的尝试如下,我见过其他正确的实现,但我无法弄清楚我的具体有什么问题。

my_flatten(List,Flattened) :- my_flatten_acc(List,Flattened,[]).

%% When first arg is an empty list, just return the rest of what was previously flattened
my_flatten_acc([],Flattened,Flattened).

%% When first arg is a list, whose first element empty list
my_flatten_acc([[]|T],Flattened,Acc) :- my_flatten_acc(T,Flattened,Acc).

%% First arg is a list, whose first element is a nonempty list
my_flatten_acc([[H|T]|T2],Flattened,[H|Acc]) :- my_flatten_acc([T|T2],Flattened,Acc).

%% First arg is a list, but not any of the above
my_flatten_acc([H|T],Flattened,[H|Acc]) :- my_flatten_acc(T,Flattened,Acc).

这在几乎所有非空输入“列表”上都会失败,我不知道为什么。

我已经看到了展平的正确实现(在此处的其他问题中以及在我第一次遇到练习的p07here中),但我并不是要求正确的实现,我只是想弄清楚我已经实现了什么我的上述尝试被误解了。

谢谢!

prolog
1个回答
0
投票

查询

?- my_flatten([[1,2],[3,4]], Result).
和 my_flatten_acc 辅助谓词中的哪个可以匹配?

my_flatten_acc([[1,2],[3,4]], Flattened, []). % the helper call

my_flatten_acc([],        Flattened, Flattened). % no, first arg mismatch
my_flatten_acc([[]|T],    Flattened, Acc).       % no, first arg mismatch
my_flatten_acc([[H|T]|T2],Flattened, [H|Acc]).   % no, third arg mismatch
my_flatten_acc([H|T],     Flattened, [H|Acc]).   % no, third arg mismatch

你并不是说累加器starts是一个空列表;列表是不可变的,所以你说它必须是一个空列表,这使得它很少用作累加器。 使用查询

trace, my_flatten([[1,2],[3,4]], F).

https://swish.swi-prolog.org进行跟踪显示它很早就失败了:

© www.soinside.com 2019 - 2024. All rights reserved.