(Atas saran @ ulangi ) Pertimbangkan permintaan program murni 1 ?- G_0.
Apa gunanya jika ada pertanyaan ?- G_0, G_0.
?
Catatan Kaki
1 Jangan tabling (agar aman), batasannya OK.
Posting sebelumnya pada subjek.
prolog
logical-purity
Salah
sumber
sumber
?- G_0(State), G_0(State).
Juga tidak ada status yang diteruskan pada tumpukan dari hasil tujuan pertama ke tujuan kedua?G_0
dapat berupa tujuan (murni) apa pun, termasuk, katakanlahG_0 = append(Xs,Ys,Zs)
G_0;G_0
satu mungkin menguji efek samping atau masalah kinerja / caching / tabeling)G_0(State),G_0(State)
agak menuliscall(G_1,State), call(G_1,State)
Jawaban:
Kueri
?- G_0, G_0.
membantu mengidentifikasi jawaban yang berlebihan?- G_0.
Untuk melakukannya cukup untuk membandingkan jumlah jawaban
?- G_0.
dengan jumlah jawaban?- G_0, G_0.
. Tidak perlu menyimpan jawaban-jawaban itu (yang merupakan sumber kesalahan yang sering terjadi). Cukup dua bilangan bulat sudah cukup! Jika mereka sama, maka tidak ada redundansi. Tetapi jika?- G_0, G_0.
memiliki lebih banyak jawaban, maka ada beberapa redundansi. Berikut ini sebuah contoh:... dan sekarang mari kita perbaiki ini:
Tidak perlu secara manual memeriksa kendala yang terlibat.
Ini dapat diperpanjang saat kami secara eksplisit mencari jawaban yang berlebihan hanya dengan menggunakan
call_nth/2
.sumber
Saya melihat tidak ada manfaat dari tujuan kedua, terutama ketika optimasi rekursi ekor ( optimasi panggilan terakhir ) adalah ON .
Saya bisa menyadari masalah GC (stack / heap overflow) saat kueri sumber daya tamak dan opsi di atas MATI (misalnya saat debugging).
Saya pikir panggilan kedua adalah redundan (untuk program murni) dan harus dihilangkan oleh kompiler.
sumber