سؤال

أنا جديد في Prolog وكنت أفكر فقط في سبب إعطائي هذه القاعدة نتيجة خاطئة بعد نتيجة واحدة صحيحة.

likes(1,banana).
likes(1,mango).

test :- likes(1,banana),likes(1,mango).

?- test.  
true;  
false.

أريد أن أعرف السبب وراء هذا الكذب.

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

المحلول

الطريقة التي يعمل بها prolog هي تقييم الاستعلامات حتى الفشل عن طريق النفي.

لقد أثبتت هنا حقيقتين:

likes(1, banana). التي تقول "1 يحب الموز"

likes(1, mango). التي تقول "1 يحب المانجو"

ثم قمت بإنشاء قاعدة، والتي يتم تقييمها بشكل أساسي على النحو التالي:

left_hand_side :- right_hand_side. left_hand_side لو right_hand_side

تقييم القاعدة كاستعلام يحاول مطابقة الحقائق والعائدات true إذا أمكن، وخاطئ إذا لم يكن مطابقًا.أحد الأشياء المهمة التي يجب ملاحظتها هو أنه، إذا تم تحديده، فسيستمر prolog في مطابقة الحقائق طالما تم تقييم القواعد true.

لذلك دعونا خطوة من خلال test :- likes(1,banana),likes(1,mango).

لو test يتم تشغيله كاستعلام، يحاول prolog أولاً likes(1,banana) وهي حقيقة مثبتة مسبقًا، وهي صحيحة.ثم ينتقل إلى likes(1,mango) وهذا، مرة أخرى، حقيقة، وهو صحيح.وصل Prolog بعد ذلك إلى نهاية القاعدة والمخرجات true.

في هذه المرحلة، إذا كنت لا تبحث عن المزيد من التطابقات، فيمكنك اختصار الاستعلام والحصول على الحقيقة فقط.ومع ذلك، إذا كنت تبحث عن المزيد من (جميع) التطابقات، فقم بـ prolog التراجعات ويحاول تقييم القاعدة مرة أخرى، والبحث عن المزيد من التطابقات.

ومع ذلك، نظرًا لأن قاعدتك تتطابق فقط مع "يحب الموز ويحب المانجو" وقد قمنا بالمطابقة بالفعل likes(1,banana), ، عندما يتراجع prolog ويحاول التقييم likes(1,banana) مرة أخرى، نظرًا لأننا قمنا بمطابقتها من قبل، هذه المرة لا توجد حقيقة أخرى (بمعنى آخر، لا يمكن "إبداء الإعجاب" بالموزة أكثر من مرة، ما لم يتم تحديد ذلك) لمطابقتها.لذلك هذا هو المكان false يأتي من.

في مترجم prolog الخاص بك، قد تتمكن من تتبع تنفيذ البرنامج الخاص بك عن طريق الكتابة trace. ثم تشغيل الاستعلام الخاص بك.أثري موضح أدناه:

| ?- trace
.
The debugger will first creep -- showing everything (trace)

(1 ms) yes
{trace}
| ?- test.
      1    1  Call: test ? 
      2    2  Call: likes(1,banana) ? 
      2    2  Exit: likes(1,banana) ? 
      3    2  Call: likes(1,mango) ? 
      3    2  Exit: likes(1,mango) ? 
      1    1  Exit: test ? 

true ? ;
      1    1  Redo: test ? 
      2    2  Redo: likes(1,banana) ? 
      2    2  Fail: likes(1,banana) ? 
      1    1  Fail: test ? 

(1 ms) no
{trace}
| ?-

شيء أخير يجب ملاحظته:إذا، بدلا من الضغط ; في ال true ? موجه، وقد ضغطت <ENTER>, ، كان النص سينتهي بـ true.

أنا سعيد لأنك طرحت هذا السؤال لأنه أتاح لي تجديدًا بسيطًا للمقدمة، وهو ما يعجبني حقًا ولكنني لم أستخدمه منذ وقت طويل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top