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.


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.