Sorting Prolog-从两个已排序的列表中创建第三个已排序列表

Sorting Prolog-从两个已排序的列表中创建第三个已排序列表,sorting,prolog,Sorting,Prolog,我试图从Prolog中已经排序的两个列表中获取第三个排序列表。 算法如下所示: 1.比较两个列表的标题 1.1如果第一个小于或等于第二个,则将其插入第三个列表,然后将其从第一个列表中删除。 1.2否则,将第二个列表的标题插入第三个列表,并将其从第二个列表中删除。 2.重复这些步骤,直到一个列表为空 理论上这应该行得通,但我缺少一些东西 这是我的密码: insSort([],[],[]). insSort([],L,L). insSort(L,[],L). insSort([H1 | T1],[H

我试图从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.
insSort([]、[]、[])。
insSort([],L,L)。
insSort(L,[],L)。
insSort([H1 | T1],[H2 | T2],L):-H1=
我认为您误解了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).
insSort([]、[]、[])。
insSort([],L,L)。
insSort(L,[],L)。
insSort([H1 | T1],[H2 | T2],L):-H1=
这样,
L
将成为
[H1 | L1]
,在这里我们知道
H1
的值,我们将通过再次调用
insSort
来计算
L1
的值


另外,这里不需要使用
append
,像
L=[H1 | L1]
这样的东西就足够了。

当前代码的结果是什么?@Osiris,我得到的结果是
false
。你知道如何获得
true
?我确实理解Prolog中变量的行为。我试图做的是类似于阶乘程序(将结果放入一个新变量,然后使用该变量递归调用过程),但我想我需要更多的练习。您的解决方案非常有效。非常感谢。