ฉันกำลังเล่นกับpredicates prolog-coroutiningfreeze/2
และfrozen/2
:
?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).
sicstus-prolog (เวอร์ชัน 4.5.1 สำหรับ x86_64) ให้คำตอบเหล่านี้:
| ? - freeze (X, a = a), ตรึง (X, เป้าหมาย) เป้าหมาย = prolog: ตรึง (X, ผู้ใช้: (a = a)) , อารัมภบท: ตรึง (X, ผู้ใช้: (a = a))? ; ไม่ | ? - freeze (X, a = a), freeze (Y, b = b), X = Y, ตรึง (X, เป้าหมาย) Y = X เป้าหมาย = (ผู้ใช้ (a = a) เปิดฉาก: แช่แข็ง (X ผู้ใช้: (ข = b))) , เปิดฉาก: แช่แข็ง (X ผู้ใช้ (a = a)) อารัมภบท: ตรึง (X, ผู้ใช้: (b = b))? ; ไม่
ตอนนี้ฉันไม่ได้คาดหวัง!Goal = prolog:freeze(X,user:(a=a))
สิ่งที่ฉันไม่ได้คาดหวังว่าจะได้คำตอบเช่นคนที่ได้รับจากSWI-เปิดฉากเวอร์ชัน 8.0.3:
? - freeze (X, a = a), ตรึง (X, เป้าหมาย) เป้าหมาย = ผู้ใช้ (a = a) , ตรึง (X, a = a) ? - freeze (X, a = a), freeze (Y, b = b), X = Y, ตรึง (X, เป้าหมาย) X = Y เป้าหมาย = (ผู้ใช้ (a = a) ผู้ใช้: (ข = b)) , แช่แข็ง (Y, a = a), ตรึง (Y, b = b)
เนื้อหาทั้งคำตอบ SICStus และคำตอบ SWI นั้นถูกต้อง ...
แต่มีเหตุผลที่ลึกกว่าสำหรับคำตอบที่แปลกประหลาดที่ SICStus ให้ไว้หรือไม่?