2013-03-13 3 views
1

Я пытаюсь понять эту сумму предикатаПредикат суммы пролога, когда задана временная переменная?

sum([], 0). 
sum([H|T], Sum) :- 
    sum(T, Temp), 
    Sum is Temp + H. 

это работает, однако я не понимаю, почему. Из моего понимания с помощью запроса, такого как sum ([1,2,3], Sum), он будет совпадать со вторым предложением, создающим экземпляр H, как 1 и T как [2,3], а Sum все равно Sum. Затем он попытается снова выполнить первую сумму вызова цели, но во второй цели, где Sum является Temp + H, когда Temp задает значение?

ответ

3

Temp Дано значение сначала в базовом футляре, sum([],0). Это вызывает Temp=0 в рекурсивном вызове выше. Вызов выше, который добавляет H дать 0+H и т.д.

Чтобы убедиться в этом, отслеживать выполнение вашего запроса:

?- trace. 
true. 

[trace] ?- sum([1,2,3], Sum). 
    Call: (6) sum([1, 2, 3], _G376) ? creep 
    Call: (7) sum([2, 3], _G455) ? creep 
    Call: (8) sum([3], _G455) ? creep 
    Call: (9) sum([], _G455) ? creep 
    Exit: (9) sum([], 0) ? creep 
^ Call: (9) _G460 is 0+3 ? creep 
^ Exit: (9) 3 is 0+3 ? creep 
    Exit: (8) sum([3], 3) ? creep 
^ Call: (8) _G463 is 3+2 ? creep 
^ Exit: (8) 5 is 3+2 ? creep 
    Exit: (7) sum([2, 3], 5) ? creep 
^ Call: (7) _G376 is 5+1 ? creep 
^ Exit: (7) 6 is 5+1 ? creep 
    Exit: (6) sum([1, 2, 3], 6) ? creep 
Sum = 6. 

(creep это мне ударяя Введите, это SWI- Prolog.)

+0

О, ладно, я забыл об использовании трассирующих ура, я думал, что каждый раз, когда Temp будет установлен на 0, но я предполагаю, что temp не равен 0, это приведет к сбою первого предиката? – Elliot678

+0

Первый предикат выполняется только тогда, когда 'T' является' [] '. – Barmar

+0

@Barmar: вы имеете в виду первое предложение, есть только один предикат. –

Смежные вопросы