พฤติกรรมที่ไม่คาดคิดของการแช่แข็ง / 2


11

ฉันกำลังเล่นกับpredicates freeze/2และfrozen/2:

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

(เวอร์ชัน 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))

สิ่งที่ฉันไม่ได้คาดหวังว่าจะได้คำตอบเช่นคนที่ได้รับจากเวอร์ชัน 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 ให้ไว้หรือไม่?


1
AFAIK ใน Sicstus ไม่มีการใช้งานฟังก์ชันสำหรับการปิดบัง "ความล้มเหลวครั้งสุดท้าย"? ; no`
Anton Danilov

สำหรับหนึ่งคุณสมบัติที่ชัดเจนจะดีกว่า
เท็จ

1
ไม่เกิน 3.8.5 ปัญหานี้ไม่มีอยู่ จาก 3.8.6 ในมันมีอยู่
เท็จ

@AntonDanilov ตกลง. แต่ฉันหมายถึงความแตกต่างในเส้นตัวหนา "เป้าหมาย = ... "
ทำซ้ำ

1
บางที @PerMildner จะตอบไหม
เท็จ

คำตอบ:


6

ฉันไม่รู้ว่ามีเหตุผล "ลึก" สำหรับความแตกต่าง ตั้งแต่frozen/2เป็นอินเตอร์เฟซทั่วไปตัวแปรประกอบชนิดของมันทำให้ความรู้สึกที่ไม่ได้กรณีพิเศษfreeze/2เป้าหมาย

ในความเป็นจริงมากถึง 4.5.1, SICStus พยายาม แต่บางครั้งล้มเหลวเพื่อfreeze/2เป้าหมายกรณีพิเศษ นี่คือเหตุผลที่คุณเห็นuser:(a=a)เป้าหมายย่อยแรก ในรุ่นถัดไปเราได้เปลี่ยนแปลงสิ่งนี้ดังนั้นผลลัพธ์จะกลายเป็นGoal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(และเราได้ทำการปรับปรุงอื่น ๆ ด้วยfrozen/2)


มากถึง 4,5,1และหลังจาก 3.8.5
เท็จ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.