لماذا تقوم SWI-prolog بتوحيد سلسلة مقتبسة وغير مقتبسة (بدون مسافات) إلى نفس القاعدة؟

StackOverflow https://stackoverflow.com/questions/4100943

سؤال

افترض أن لدي القواعد التالية:

unify('test', 'this is a test').
run :- write('Enter something: '), 
       read(X), 
       unify(X, Y), 
       write('The answer is '), write(Y).

ثم أقوم بتشغيله على النحو التالي:

?- ['unify.pl'].
% unify.pl compiled 0.00 sec, -48 bytes
true.

?- run.
Enter something: test.
The answer is this is a test
true.

?- run.
Enter something: 'test'.
The answer is this is a test
true.

لماذا يوحد SWI-prolog كليهما test و 'test' إلى unify('test', 'this is a test').؟ صادفت هذا أثناء الإجابة على سؤال مقدمة على ذلك. على الرغم من أنني تمكنت من الإجابة على سؤال الشخص ، لم أستطع شرح هذا السلوك بالذات ، وكنت أتساءل عما إذا كان أي شخص آخر يستطيع ذلك.

هل كانت مفيدة؟

المحلول

بينما يمكن الإشارة إلى الذرات في SWI-prolog باستخدام عروض أسعار واحدة ، على سبيل المثال ، 'This is an atom', اقتباسات واحدة لا حاجة عندما يتمكن محلل SWI-prolog من تحديد ذرة من سلسلة من الأحرف ، عادة ما تبدأ بشخصية أبجدية صغيرة ، مثل test. إذا كان التسلسل يحتوي على مساحة بيضاء (أو بعض الأحرف الأخرى) ، فستحتاج إلى عروض الأسعار المفردة للدلالة على ذرة بشكل صحيح. الشخصيات الأبجدية الرقمية وبعض شخصيات علامات الترقيم مثل السطحي _ بخير ، على سبيل المثال ، test5_6.

إذا كان تسلسل الأحرف بدون عروض أسعار فردية سيبدأ بأي شيء آخر ، مثل رقم 6k, ، سوف يعاملها المحلل على أنها أ number; ؛ إذا كانت شخصية أبجدية كبيرة مثل Test, ، سوف يعاملها المحلل كمتغير.

نصائح أخرى

هذا ليس سلوكًا محددًا SWI - إنه مطلوب وفقًا للمعيار. هناك طريقة بسيطة لرؤية هذا. يمكنك استخدام هذا أيضًا لأي مصطلح آخر لم يكن بناء الجملة واضحًا. كلا النوعين في toplevel:

?- X = 'test'.
X = test.

?- X = 'this is a test'.
X = 'this is a test'.

الإجابة هي دائمًا نص مقدمة صالح - وهذا خاص بـ SWI ولكن أيضًا للعديد من أنظمة Prolog الأخرى مثل YAP و GNU و B ، إذا ، Sicstus.

هناك طريقة أخرى لرؤية هذا لاستخدام Write_Canonical/1:

?- write_canonical('this is a test').
'this is a test'
true.

?- write_canonical([a,b,(c,d),{e,f}]).
'.'(a,'.'(b,'.'(','(c,d),'.'({}(','(e,f)),[]))))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top