как мне сделать так, чтобы моя функция слияния показывала возможные комбинации списков в PROLOG - PullRequest
0 голосов
/ 29 мая 2018

Я работаю над объединением списков в PROLOG.Каковы возможные изменения, которые мне нужно сделать, чтобы мой код показывал эти выходные данные.

?- merge(X, [1,2], [1,2,3]).  # lists that merge with [1,2] to give [1,2,3]
X = [1,2,3] ? ;
X = [1,3] ? ;
X = [2,3] ? ;
X = [3] ? ;
no

?- merge(X, Y, [1,2]).        # pairs of lists that merge to give [1,2]
X = [], Y = [1,2] ? ;
X = [1,2], Y = [] ? ;
X = [1], Y = [1,2] ? ;
X = [1,2], Y = [1] ? ;
X = [1,2], Y = [1,2] ?
X = [1], Y = [2] ? ;
X = [1,2], Y = [2] ? ;
X = [2], Y = [1] ? ;
X = [2], Y = [1,2] ? ;
no

Код, который я сейчас использую для слияния:

merge( [], RS, RS ).
merge( LS, [], LS ).
merge( [L|LS], [R|RS], [L|T] ) :- L =< R, merge(    LS, [R|RS], T).
merge( [L|LS], [R|RS], [R|T] ) :- L > R,  merge( [L|LS],   RS,  T).

Заранее спасибо

1 Ответ

0 голосов
/ 29 мая 2018

Переместить сравнение (=< / >) после рекурсивный вызов:

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] ;
...
...