Saya bermain-main dengan predikat prolog-coroutiningfreeze/2
dan frozen/2
:
?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).
sicstus-prolog (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 Swi-prolog 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?
Jawaban:
Saya tidak tahu apakah ada alasan "dalam" untuk perbedaan itu. Karena
frozen/2
merupakan antarmuka umum untuk variabel yang dikaitkan, itu masuk akal untuk tidak menjadifreeze/2
tujuan kasus khusus .Bahkan, hingga 4.5.1, SICStus mencoba, tetapi terkadang gagal, ke
freeze/2
tujuan kasus khusus . Inilah sebabnya mengapa Anda melihatuser:(a=a)
untuk sub-sasaran pertama. Dalam rilis berikutnya kami telah mengubah ini sehingga hasilnya akan menjadiGoal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))
(dan kami juga telah membuat beberapa perbaikan lainnyafrozen/2
).sumber