我目前正在开始学习 Prolog,并努力解决甚至基本的问题。
我当前的任务是创建一个谓词来展平嵌套列表。我不应该为此使用剪切运算符、累加器或 ->
。
我当前的谓词如下所示:
my_flatten(X,[X]) :- \+ is_list(X).
my_flatten([],[]).
my_flatten([X|Rest],Flattened) :-
my_flatten(X,Xflat),
my_flatten(Rest,Restflat),
append(Xflat,Restflat,Flattened).
这对于大多数输入来说都符合预期。但是,查询 my_flatten(abc, [abc])
返回 true
而不是 false
。
因此元素 1 必须是一个列表,但这会干扰规则 1,该规则标记嵌套列表递归的底部。
编辑:
flattenx([],[]).
flattenx([H|T], R) :- flattenx(H, FH), append(FH, FT, R) , flattenx(T, FT).
flattenx([H|T], R) :- \+ flattenx(H, FH), R = [H|FT], flattenx(T, FT).
最佳答案
我的回答只是为了证明您在编辑:段落之后发布的解决方案不(严格)满足您的先决条件,因为 \+
(和 ->
,即 if-then-else)只是语法糖,可以使 cut' 的使用不太容易出错。您可以改为在头部中使用明确的模式来指导子句选择。例如
flatten_no_cut([],[]).
flatten_no_cut([[A|As]|Xs],Fs) :-
flatten_no_cut([A|As],Gs),
flatten_no_cut(Xs,Es),
append(Gs,Es,Fs).
flatten_no_cut([X|Xs],[X|Ys]) :-
flatten_no_cut(Xs,Ys).
关于recursion - 使用附加子句展平 Prolog 中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52654481/