Пролог - Как получить только результаты с измененным списком - PullRequest
0 голосов
/ 20 марта 2020

Я хочу создать replace / 4 (replace (X, Y, MyList, ReplacedList)) и изменить первый X в MyList на Y, а затем изменить только следующий X и так далее.

Это пример вывода, который я хочу получить:

?- replace(1,a,[1,2,1,1,3],R). 
R = [a, 2, 1, 1, 3] ; 
R = [1, 2, a, 1, 3] ; 
R = [1, 2, 1, a, 3] ; 
No

и это код, который я написал до сих пор

replace(_, _, [], []).

replace(X, Y, [X|Tail], [Y|Tail2]):-
    replace(X, X, Tail, Tail2).

replace(X, Y, [Head|Tail], [Head|Tail2]):-
    replace(X, Y, Tail, Tail2).

Пока я получаю каждый вывод что мне нужно, я действительно повторяю некоторые из них, и я не понимаю, почему. Выходные данные, которые я получаю, равны

?- replace(1,a,[1,2,1,1,3],R).
R = [a, 2, 1, 1, 3]
R = [a, 2, 1, 1, 3]
R = [a, 2, 1, 1, 3]
R = [a, 2, 1, 1, 3]
R = [1, 2, a, 1, 3]
R = [1, 2, a, 1, 3]
R = [1, 2, 1, a, 3]
R = [1, 2, 1, 1, 3]

Каждый повторяющийся вывод отображается столько раз, сколько предметов в хвосте после замененного символа. Это единственная подсказка, которую я имею до сих пор.

...