Rekursi prolog dalam jumlah n bilangan asli

Saya kesulitan memahami bagaimana nilai Z terus berubah. Langkah spesifiknya telah ditunjukkan dalam keluaran pelacakan tumpukan.

Berikut adalah kode yang saya gunakan untuk mencari jumlah N bilangan asli -

sum1(1,1).
sum1(N, Sum) :-
   Next is N-1,
   sum1(Next, Z),
   Sum is Z + N.

Inilah jejak tumpukannya -

?- sum1(3,_).
   Call: (8) sum1(3, _2668) ? creep
   Call: (9) _2860 is 3+ -1 ? creep
   Exit: (9) 2 is 3+ -1 ? creep
   Call: (9) sum1(2, _2862) ? creep
   Call: (10) _2866 is 2+ -1 ? creep
   Exit: (10) 1 is 2+ -1 ? creep
   Call: (10) sum1(1, _2868) ? creep
   Exit: (10) sum1(1, 1) ? creep
   Call: (10) _2872 is 1+2 ? creep
   Exit: (10) 3 is 1+2 ? creep
   Exit: (9) sum1(2, 3) ? creep **%How is Z assigned value 3 ?**
   Call: (9) _2668 is 3+3 ? creep
    Exit: (9) 6 is 3+3 ? EOF: exit

Terima kasih sebelumnya!


person Markandeya    schedule 09.04.2018    source sumber
comment
Pada dasarnya, variabel dicakup ke dalam panggilan yang mereka ikuti. Setiap variabel di antara panggilan diberi variabel anonim baru hingga variabel tersebut disatukan dengan variabel yang diteruskan ke variabel tersebut. Ini berarti bahwa jika Anda menggunakan Z di beberapa lokasi, Z tidak dipakai, dan katakanlah Z = A, variabel anonim baru _1234 dibuat, ditetapkan ke A dan semua lokasi di mana Z digunakan.   -  person G_V    schedule 10.04.2018


Jawaban (1)


Itu tidak “berubah”; setiap bukti sum1 mendapatkan versi N, Sum, Next dan Z sendiri. Inilah sebabnya, dalam pelacakan tumpukan, masing-masing mendapat nama yang dihasilkan berbeda (yaitu _2860), sehingga Prolog dapat membedakannya.

Mengenai pertanyaan spesifik Anda, 2 baris di atas baris yang Anda tanyakan, Sum tersebut adalah _2872; jadi pembuktian _2872 is 1+2 membutuhkan _2872 menjadi 3. Dan Sum ini cocok dengan panggilan sebelumnya sum(1, _2868), di mana _2868 adalah Z sum1 itu (seperti yang Anda lihat dari 2 baris di atasnya).

person Scott Hunter    schedule 09.04.2018
comment
Jadi, 3 ditugaskan ke sum1(2, _2862) karena prolog cocok dengan panggilan sebelumnya. - person Markandeya; 09.04.2018
comment
3 ditugaskan ke _2862. - person Scott Hunter; 09.04.2018