gpt4 book ai didi

prolog - PROLOG 中的深度逆向 - 列表

转载 作者:行者123 更新时间:2023-12-02 11:54:31 24 4
gpt4 key购买 nike

嘿,我正在尝试创建一个谓词,用于在 PROLOG 中的嵌套列表上生成深度反转。

目前我得到了这个谓词

reverse(L,A) :- rev(L,[], A).
rev([],A,A).
rev([H|L],R,A) :- rev(L,[H|R],A).

结果如下所示:

reverse([1,2,3],A).
A = [3, 2, 1].

reverse([[0,1],2,3],A).
A = [3, 2, [0, 1]].

问题是,内部列表没有反转。它应该看起来像这样:

reverse([[0,1],2,3],A).
A = [3, 2, [1, 0]].

reverse([1,2,[3,4,5,[6,7],8],[9,10],11,12],A).
A = [12,11,[10,9],[8,[7,6],5,4,3],2,1].

感谢您的帮助。

最佳答案

表示数据的方式称为defaulty,因为在推理时需要default情况:

  • 这是一个列表吗? → 有东西存在
  • 否则 → 其他情况成立。

这样的表述会带来很多麻烦。例如,考虑其他答案中的 my_reverse/2 。它的主要问题是,它过早且错误提交其中一种情况,尽管两种情况仍然有可能:

?- my_reverse([X], Ls).Ls = [X].

但是这个答案仅适用于X不是列表的情况!这个问题导致谓词出现以下奇怪的行为:

?- my_reverse([X], Ls), X = [1,2,3].Ls = [[1, 2, 3]],X = [1, 2, 3].

这意味着即使 X 是一个列表,它的元素不会颠倒!

您应该始终以更清晰的表示为目标,以区分可能出现的情况。

例如,您对以下表示数据的方式有何看法:

  • list(Ls) 代表列表 Ls
  • n(N) 代表数字 N

通过这样的表示,我们可以象征性地区分情况。我将此作为更具声明性的解决方案的起点。

关于prolog - PROLOG 中的深度逆向 - 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38628548/

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