لماذا تقوم SWI-prolog بتوحيد سلسلة مقتبسة وغير مقتبسة (بدون مسافات) إلى نفس القاعدة؟
-
29-09-2019 - |
سؤال
افترض أن لدي القواعد التالية:
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)),[]))))