У меня проблема. Я хочу реализовать предикат замены (E1, L1, E2, L2). Это верно, когда L1 и L2 являются одними и теми же списками, за исключением того, что в одном месте, где L1 имеет значение E1, L2 имеет E2. Кроме того, заменяется только одно вхождение и оно должно работать в любом режиме.
Например:
replace(2,[1,2,3,4],5,X)
должно быть только решение X = [1,5,3,4]
.
replace(2,[1,2,3,2,1],5,X)
следует вернуться к решениям X =
[1,5,3,2,1]
и X = [1,2,3,5,1]
.
replace(2,X,5,[1,5,3,5,1])
следует вернуться к решениям X =
[1,2,3,5,1]
и X = [1,5,3,2,1]
.
replace(X,[a,b,c,d],Y,[a,e,c,d])
должно быть только решение X = b,
Y = e
.
replace(X,[1,2,3,2,1],Y,[1,5,3,5,1])
не должно иметь решений (не должно быть).
Моя реализация:
replace(E1, L1, E2, L2) :-
append(X, [E1|L_Tail], L1),
append(X, [E2|L_Tail], L2).
Этот код в порядке. Однако, когда replace(2,X,5,[1,5,3,5,1])
, он должен возвращать X = [1,2,3,5,1]
и X = [1,5,3,2,1]
и false
. Он возвращает только первые 2 результата, а false
не подошел. Программа заканчивается ERROR: Out of global stack
.