Używasz SWI? Jeśli tak to w takich przypadkach może pomóc trace.
1 ?- zmien([1, 2, 3], X).
false.
2 ?- trace.
true.
[trace] 2 ?- zmien([1, 2, 3], X).
Call: (6) zmien([1, 2, 3], _G553) ? creep
^ Call: (7) _G637 is 1+1 ? creep
^ Exit: (7) 2 is 1+1 ? creep
Call: (7) zmien([2, 3], _G553) ? creep
^ Call: (8) _G640 is 2+1 ? creep
^ Exit: (8) 3 is 2+1 ? creep
Call: (8) zmien([3], _G553) ? creep
^ Call: (9) _G643 is 3+1 ? creep
^ Exit: (9) 4 is 3+1 ? creep
Call: (9) zmien([], _G553) ? creep
Exit: (9) zmien([], []) ? creep
Call: (9) dodaj(4, [], []) ? creep
Fail: (9) dodaj(4, [], []) ? creep
Fail: (8) zmien([3], _G553) ? creep
Fail: (7) zmien([2, 3], _G553) ? creep
Fail: (6) zmien([1, 2, 3], _G553) ? creep
false.
[trace] 3 ?- notrace.
true.
[debug] 4 ?- zmien([1, 2, 3], X).
false.
Z tego wynika (w miarę jasno) że powód błędu jest dość oczywisty - pusta lista ( []
) nie unifikuje się z [X|L].
To tyle odnośnie debugowania, bo nie do końca rozumiem czemu akurat tak ułożyłeś te predykaty?
Ja bym to zrobił przez rekurencyjne sumowanie kolejnych elementów listy, aż dojdziemy do pustej:
inkrementuj([], []).
inkrementuj([LH|LT], [RH|RT]) :-
RH is LH + 1,
inkrementuj(LT, RT).
Mam nadzieję że się nie spóźniłem z odpowiedzią (i że pomogłem) :]