如何在Prolog中获取输出列表?

如何在Prolog中获取输出列表?,prolog,Prolog,我想合并两个有序列表,我认为我做的是正确的,但是我如何输出列表L ?merge([1,3,4],[2,5,6],L). merge([],[],_):-!. merge([X|SX],[],L):- merge(SX,[],[X|L]). merge([],[Y|YS],L):- merge([],YS,[Y|L]). merge([X|SX],[Y|YS],L):- X<Y, merge(SX,[Y|YS],[X|L]). merge([X|SX],[Y|YS],L):- X>=

我想合并两个有序列表,我认为我做的是正确的,但是我如何输出列表L

?merge([1,3,4],[2,5,6],L).

merge([],[],_):-!.
merge([X|SX],[],L):- merge(SX,[],[X|L]).
merge([],[Y|YS],L):- merge([],YS,[Y|L]).
merge([X|SX],[Y|YS],L):- X<Y, merge(SX,[Y|YS],[X|L]).
merge([X|SX],[Y|YS],L):- X>=Y, merge([X|SX],YS,[Y|L]).
?合并([1,3,4],[2,5,6],L)。
合并([],[],[合并]:-!。
合并([X | SX],[X],L]:-merge(SX,[],[X | L])。
合并([],Y | YS],L):-合并([],Y,[Y | L])。
合并([X | SX],[Y | YS],L):-X=Y,合并([X | SX],[Y | L])。

您没有得到
L
的绑定,因为实际上您的过程没有进一步实例化它

您似乎正在使用累加器,但忘记为其使用辅助参数。 此外,使用累加器可以反向构建列表,因此在基本情况下需要反向:

merge(X, Y, L):-
  merge(X, Y, [], L).

merge([],[],L, L1):- reverse(L, L1).
merge([X|SX],[],L, L1):- merge(SX,[],[X|L], L1).
merge([],[Y|YS],L, L1):- merge([],YS,[Y|L], L1).
merge([X|SX],[Y|YS],L, L1):- X<Y, merge(SX,[Y|YS],[X|L], L1).
merge([X|SX],[Y|YS],L, L1):- X>=Y, merge([X|SX],YS,[Y|L], L1).
您也可以重写您的程序,以便直接“添加”各条款标题中的项目:

merge([],[],[]).
merge([X|SX],[],[X|L]):- merge(SX,[],L).
merge([],[Y|YS],[Y|L]):- merge([],YS,L).
merge([X|SX],[Y|YS],[X|L]):- X<Y, merge(SX,[Y|YS],L).
merge([X|SX],[Y|YS],[Y|L]):- X>=Y, merge([X|SX],YS,L).
merge([]、[]、[])。
合并([X | SX],[X | L]):-merge(SX,[],L)。
合并([],[Y | YS],[Y | L]):-合并([],Y,L)。
合并([X | SX],[Y | YS],[X | L]):-X=Y,合并([X | SX],YS,L)。
子句
合并([X|SX],[X|L]):-merge(SX,[],L)。
可以被
合并(Xs,[],Xs)替换。
和子句
合并([],[Y | YS],[Y | L]):-merge([],YS,L)。
可以被
合并([],YS,YS)替换。
@slago:I刚刚“调整”了操作代码。按原样,如果使用非列表,代码将失败,而根据您的建议,例如使用
merge([这不是列表],],L),代码将成功。
merge([],[],[]).
merge([X|SX],[],[X|L]):- merge(SX,[],L).
merge([],[Y|YS],[Y|L]):- merge([],YS,L).
merge([X|SX],[Y|YS],[X|L]):- X<Y, merge(SX,[Y|YS],L).
merge([X|SX],[Y|YS],[Y|L]):- X>=Y, merge([X|SX],YS,L).