【问题标题】:Prolog - Create a third sorted list from two already-sorted listsProlog - 从两个已经排序的列表中创建第三个排序列表
【发布时间】:2011-05-21 12:27:58
【问题描述】:

我正在尝试从 Prolog 中的两个已排序列表中获取第三个排序列表。 算法如下: 1.比较两个列表的头部 1.1 如果第一个小于或等于第二个,则将其插入到第三个列表中,然后将其从第一个列表中删除。 1.2 否则,将第二个列表的头部插入第三个并从第二个中删除。 2. 重复这些步骤,直到一个列表为空。

理论上这应该可行,但我缺少一些东西。

这是我的代码:

insSort([],[],[]).
insSort([],L,L).
insSort(L,[],L).
insSort([H1 | T1],[H2 | T2],L) :- H1 =< H2,
                                    append([H1],[],L1),
                                    insSort(T1,[H2 | T2],L1),L=L1,!.

insSort([H1 | T1],[H2 | T2],L) :- append([H2],[],L1),
                                    insSort(T2,[H1 | T1],L1),L=L1.

【问题讨论】:

  • 用当前代码得到什么结果?
  • @Osiris,我得到的结果是false
  • 你知道如何获得true 吗?

标签: sorting prolog


【解决方案1】:

我认为您误解了 Prolog 变量的行为方式。在你给一个变量赋值之后(术语是“统一”),你永远不能改变它。因此,当您将[H1] 的值分配给L1(使用append 以相当复杂的方式)时,另一个insSort 无法使用它来返回结果。修复代码的方法如下:

insSort([],[],[]).
insSort([],L,L).
insSort(L,[],L).
insSort([H1 | T1],[H2 | T2],L) :- H1 =< H2,
                                  append([H1],L1,L),
                                  insSort(T1,[H2 | T2],L1),!.

insSort([H1 | T1],[H2 | T2],L) :- append([H2],L1,L),
                                  insSort(T2,[H1 | T1],L1).

这样,L 将变为[H1|L1],我们知道H1 的值,我们将在一段时间内通过再次调用insSort 来计算L1 的值。

另外,这里不需要使用appendL = [H1|L1] 之类的就足够了。

【讨论】:

  • 我确实了解变量在 Prolog 中的行为方式。我试图做的类似于阶乘程序(将结果放入一个新变量中,然后使用该变量递归调用该过程),但我想我需要更多练习。您的解决方案完美运行。谢谢一百万。
猜你喜欢
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多