gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:55:21 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com