Perilaku beku yang tak terduga / 2


11

Saya bermain-main dengan predikat freeze/2 dan frozen/2:

?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).

(versi 4.5.1 untuk x86_64) memberikan jawaban ini:

| ? - bekukan (X, a = a), beku (X, Sasaran).
Sasaran = prolog: membekukan (X, pengguna: (a = a)) ,
prolog: membekukan (X, pengguna: (a = a))? ;
tidak
| ? - membekukan (X, a = a), membekukan (Y, b = b), X = Y, beku (X, Sasaran).
Y = X,
Sasaran = (pengguna: (a = a), prolog: beku (X, pengguna: (b = b))) ,
prolog: membekukan (X, pengguna: (a = a)),
prolog: membekukan (X, pengguna: (b = b))? ;
tidak

Sekarang saya tidak menyangka!Goal = prolog:freeze(X,user:(a=a))

Apa yang saya lakukan harapkan adalah jawaban seperti yang diberikan oleh versi 8.0.3:

? - bekukan (X, a = a), beku (X, Sasaran).
Sasaran = pengguna: (a = a) ,
membekukan (X, a = a).
? - membekukan (X, a = a), membekukan (Y, b = b), X = Y, beku (X, Sasaran).
X = Y,
Sasaran = (pengguna: (a = a), pengguna: (b = b)) ,
membekukan (Y, a = a),
membekukan (Y, b = b).

Arguably, baik jawaban SICStus dan jawaban SWI benar ...

Tetapi apakah ada alasan yang lebih dalam untuk jawaban yang agak aneh yang diberikan oleh SICStus?


1
AFAIK di Sicstus fungsi untuk menutupi "kegagalan terakhir" tidak diimplementasikan `? ; no`
Anton Danilov

Pertama, kualifikasi eksplisit lebih disukai.
false

1
Hingga 3.8.5 masalah ini tidak ada. Dari 3.8.6 di atasnya memang ada.
false

@AntonDanilov. Baik. Tetapi saya sebenarnya merujuk pada perbedaan dalam garis tebal "Sasaran = ...".
ulangi

1
Mungkin @PerMildner akan menjawab?
false

Jawaban:


6

Saya tidak tahu apakah ada alasan "dalam" untuk perbedaan itu. Karena frozen/2merupakan antarmuka umum untuk variabel yang dikaitkan, itu masuk akal untuk tidak menjadi freeze/2tujuan kasus khusus .

Bahkan, hingga 4.5.1, SICStus mencoba, tetapi terkadang gagal, ke freeze/2tujuan kasus khusus . Inilah sebabnya mengapa Anda melihat user:(a=a)untuk sub-sasaran pertama. Dalam rilis berikutnya kami telah mengubah ini sehingga hasilnya akan menjadi Goal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(dan kami juga telah membuat beberapa perbaikan lainnya frozen/2).


hingga 4,5,1 dan setelah 3,8,5
false
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.