जमे हुए / 2 का अप्रत्याशित व्यवहार


11

मैं प्रेडिकेट्स के साथ चारों ओर खेल रहा था freeze/2और frozen/2:

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

(x86_64 के लिए संस्करण 4.5.1) ने ये उत्तर दिए:

| ? - फ्रीज (एक्स, ए = ए), जमे हुए (एक्स, गोल)।
लक्ष्य = प्रोलॉग: फ्रीज (एक्स, उपयोगकर्ता: (ए = ए)) ,
प्रोलॉग: फ्रीज (एक्स, उपयोगकर्ता: (ए = ए))? ;
नहीं
| ? - फ्रीज (एक्स, ए = ए), फ्रीज (वाई, बी = बी), एक्स = वाई, फ्रोजन (एक्स, गोले)।
Y = X,
लक्ष्य = (उपयोगकर्ता: (ए = ए), प्रस्तावना: फ्रीज (एक्स, उपयोगकर्ता: (बी = बी)) ,
prolog: फ्रीज (एक्स, उपयोगकर्ता: (क एक =)),
प्रोलॉग: फ्रीज (एक्स, उपयोगकर्ता: (बी = बी))? ;
नहीं

अब मुझे उम्मीद नहीं थी!Goal = prolog:freeze(X,user:(a=a))

मुझे क्या उम्मीद थी कि जैसे जवाब थे, जैसे कि संस्करण 8.0.3 द्वारा दिया गया है :

? - फ्रीज (एक्स, ए = ए), जमे हुए (एक्स, गोल)।
लक्ष्य = उपयोगकर्ता: (ए = ए) ,
फ्रीज (एक्स, ए = ए)।
? - फ्रीज (एक्स, ए = ए), फ्रीज (वाई, बी = बी), एक्स = वाई, फ्रोजन (एक्स, गोले)।
एक्स = वाई,
लक्ष्य = (उपयोगकर्ता: (ए = ए), उपयोगकर्ता: (बी = बी)) ,
फ्रीज (Y, a = a),
फ्रीज (वाई, बी = बी)।

संभवतः, SICStus उत्तर और SWI उत्तर दोनों सही हैं ...

लेकिन क्या SICStus द्वारा दिए गए कुछ अजीबोगरीब जवाब (ओं) का गहरा कारण है?


1
AFAIK सिसिली में "अंतिम विफलता" मास्किंग के लिए कार्यक्षमता `लागू नहीं है? ; नहीं `
एंटोन

एक के लिए, स्पष्ट योग्यता बेहतर है।
झूठे

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 के बाद
झूठी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.