Zadanie z listami i rekurencją.

0

Witam, mam takie zadanie:
Napisz predykat dodaj1, który jako pierwszy argument ma listę liczb, a drugim argumentem jest
lista liczba otrzymanych z pierwszej listy przez dodanie do każdej liczby 1. Na przykład na pytanie:
dodaj1([1,2,7,2],X).
prolog powinien wyświetlić odpowiedź:
X=[2,3,8,3].

Zrobiłem coś takiego:

zmien([],[]).
zmien([G|O],Lista):-G1 is G+1,zmien(O,Lista),dodaj(G1,Lista,Lista).
dodaj(X,L,[X|L]).

Niestety kod nie działa, i nie wiem czemu. Prolog odpowiada tylko "false". Mógłby mi ktoś wytłumaczyć czemu to nie działa, bo siedzę nad tym i nic nie mogę wymyślić.

0

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) :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0