Gunakan tujuan yang berlebihan dalam kueri

12

(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.

Salah
sumber
Mengkuadratkan jumlah hasil?
Willem Van Onsem
1
Saya menganggap bahwa tidak ada informasi negara yang disimpan dari menjalankan tujuan secara berurutan. Dengan kata lain variasi pertanyaan tidak diperbolehkan, mis. ?- G_0(State), G_0(State).Juga tidak ada status yang diteruskan pada tumpukan dari hasil tujuan pertama ke tujuan kedua?
Guy Coder
1
G_0dapat berupa tujuan (murni) apa pun, termasuk, katakanlahG_0 = append(Xs,Ys,Zs)
false
1
@GuyCoder: diperlukan konjungsi. (Dengan G_0;G_0satu mungkin menguji efek samping atau masalah kinerja / caching / tabeling)
salah
1
BTW, bukannya yang G_0(State),G_0(State)agak menuliscall(G_1,State), call(G_1,State)
salah

Jawaban:

3

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:

p(f(_,a)).
p(f(b,_)).

?- p(X).
   X = f(_A, a)
;  X = f(b, _A).  % two answers

?- p(X), p(X).
   X = f(_A, a) 
;  X = f(b, a)
;  X = f(b, a)
;  X = f(b, _A).   % four answers
                   % thus p(X) contains redundancies

... dan sekarang mari kita perbaiki ini:

p(f(B,a)) :-
   dif(B, b).
p(f(b,_)).

?- p(X).
   X = f(_A, a), dif(_A, b)
;  X = f(b, _A).

?- p(X), p(X).
   X = f(_A, a), dif(_A, b), dif(_A, b).
;  X = f(b, _A).    % again two answers, thus no redundancy

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.

?- G_0, call_nth(G_0, 2).
Salah
sumber
1

Pertimbangkan permintaan program murni1? - G_0. Apa gunanya jika ada permintaan? - G_0, G_0. memiliki?

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.

Anton Danilov
sumber