recursion - 使用附加子句展平 Prolog 中的列表

标签 recursion prolog

我目前正在开始学习 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/

相关文章:

java - 使用递归来测试两个字符串是否相同但方向相反

prolog - 尝试编写谓词 GradeMap(L,R),其中 L 是百分比等级值的列表,R 是相应等级字母 (a-f) 的列表

prolog - 如何在 SICStus Prolog 中模拟 SWI-Prolog 的 atom_to_term(+Atom, -Term, -Bindings)?

prolog - 在 Prolog 中解决 "Feed the Golorp"难题

recursion - 递归和迭代之间的区别

c - 为什么下面两段的输出不同?

javascript - 将平面对象数组转换为嵌套对象

prolog - 唯一长度的子列表

prolog - Prolog 中的 +,+ 模式是什么意思?

javascript - 未命名函数 JavaScript 的递归函数调用