Переместить сравнение (=<
/ >
) после рекурсивный вызов:
merge( [], RS, RS ).
merge( LS, [], LS ).
merge( [L|LS], [R|RS], [L|T] ) :- merge( LS, [R|RS], T), L =< R.
merge( [L|LS], [R|RS], [R|T] ) :- merge( [L|LS], RS, T), L > R.
=<
/ >
не работают с несвязанными переменными, но если вы переместите сравнение после вызова на merge
, переменные L
и R
будут связаны снекоторое значение при рекурсивном вызове.
?- merge([1,2,3],[2,4,6],X).
X = [1, 2, 2, 3, 4, 6] ;
false.
?- merge([1,2,3],X,[1,2,3,4]).
X = [4] ;
false.
?- merge(Y,X,[1,2,3,4]).
Y = [],
X = [1, 2, 3, 4] ;
Y = [1, 2, 3, 4],
X = [] ;
Y = [1],
X = [2, 3, 4] ;
Y = [1, 2],
X = [3, 4] ;
...