كل يوم أحد في شركتنا ، من المعتاد ترتيب اختبارات ممتعة ، هذه واحدة منها.
لغز
للعثور على قاتل السيد بودي ، تحتاج إلى معرفة أين كان كل شخص وما هي الأسلحة الموجودة في الغرفة. تنتشر تلميحات في جميع أنحاء الاختبار (لا يمكنك الإجابة على السؤال الأول حتى تقرأ كل عشرة).
- أولاً ، تخيل المشتبه بهم. هناك ثلاثة رجال (جورج ، جون ، روبرت) وثلاث نساء (باربرا ، كريستينا ، يولاندا). كل شخص في غرفة منفصلة (حمام ، غرفة طعام ، مطبخ ، غرفة معيشة ، مخزن ، مكتب). تم العثور على أسلحة مشبوهة في كل غرفة (حقيبة ، سلاح ناري ، غاز ، سكين ، سم ، حبل). سؤال: من وجد في المطبخ؟
- نصيحة 1. مع وجود رجل في المطبخ ، لا يوجد حبل ولا سكين ولا حقيبة. السلاح ليس سلاحا ناريا. سؤال: ما هي الأسلحة التي عثر عليها في المطبخ؟
- تلميح 2. باربرا إما في الدراسة أو في الحمام ، ويولاندا في آخر من الغرفتين المسمىتين. في أي غرفة وجدت باربرا؟
- نصيحة 3. الرجل الذي يحمل الكيس ليس باربرا ولا جورج ، ولم يكن في الحمام ولا في غرفة الطعام. من كان لديه الحقيبة؟
- نصيحة 4. تم العثور على امرأة بحبل في المكتب. من هذا
- نصيحة 5. السلاح في غرفة المعيشة ينتمي إلى جون أو جورج. أي نوع من الأسلحة في غرفة المعيشة؟
- نصيحة 6. لم يكن هناك سكين في غرفة الطعام. أين كان السكين؟
- تلميح 7. Yolanda لم يكن في المكتب ولا في مخزن مع الأسلحة المناسبة لهذه الغرف. ما نوع السلاح الذي تملكه يولاندا؟
- نصيحة 8. وجد جورج سلاحا ناريا. أي غرفة؟
- وقد اكتشف أن السيد بودي قد تعرض للغاز في المخزن. المشتبه به في تلك الغرفة كان قاتل. من هذا
أنا أسير على هذه الألغاز (في الواقع من أي الألغاز تقريبا). يمكن أن يستغرقوا ساعات وساعات من التفكير ، ولكن Prolog يأتي دائمًا لإنقاذ! دعونا نرى كيف يساعد على حل مثل هذه المشاكل للتفكير.
Prolog 101
تثبيت SWI-Prolog
~> swipl Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.6.6) Copyright (c) 1990-2013 University of Amsterdam, VU Amsterdam SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Please visit http://www.swi-prolog.org for details. For help, use ?- help(Topic). or ?- apropos(Word). ?- write('Hello, World!'). Hello, World! true. ?- write('Hello,'), nl, write('world'). Hello, world true. ?- X is 3*4 + 2. X = 14.
swipl
- مترجم Prolog- تسمى
write
دالة ، ويعني تمثيل write/1
أن الأمر يتطلب وسيطة واحدة (نفس المفهوم في Erlang و Elixir لإضافة عدد الوسائط إلى اسم دالة) - يستخدم
nl
لطباعة سطر جديد - يتم فصل تسلسل الأوامر بفواصل ، والتي تحل أيضًا محل عامل التشغيل AND
- يتبع عامل الاحالة تعبير رياضي
- تتم كتابة المتغيرات في العاصمة
X
، وليس س
قاعدة المعرفة
جوهر Prolog هو في ذكر الحقائق ، وتجميع الحقائق وطلبها.
إنشاء ملف
hello.pl
:
friend(john, julia). friend(john, jack). friend(julia, sam). friend(julia, molly). loves(john, julia). loves(julia, sam). loves(sam, julia). male(brad). male(john). male(jim). male(alfred). female(marry). child(brad, alfred). child(john, jim). child(john, marry).
- نحن نستخدم
[hello].
للتحميل [hello].
: إيلاء الاهتمام لهذه النقطة في النهاية - يسرد كل الحقائق في قاعدة المعرفة
?- [hello]. % hello compiled 0.00 sec, 3 clauses true. ?- listing(friend). friend(john, julia). friend(john, jack). friend(julia, sam). friend(julia, molly). true. ?- listing(loves). loves(john, julia). loves(julia, sam). loves(sam, julia). true.
طلب حقائق
بعد ذكر الحقائق في قاعدة المعرفة ، يمكننا المضي قدمًا وطرح أسئلة حول حقيقة الوقائع ، وكذلك ما هي الاستنتاجات التي يمكن استخلاصها منها.
?- friend(john, julia). true . ?- friend(john, jack). true. ?- loves(john, julia). true. ?- loves(john, sam). false.
يمكننا تعويض الأسئلة الأكثر تعقيدًا. على سبيل المثال ، من هو صديق جون أو الذي يحب جوليا.
?- friend(john, Who). Who = julia ; Who = jack.
?- listing(child). child(brad, alfred). child(john, jim). child(john, mary). true. ?- child(john, X). X = jim ; X = mary.
هل جون في منطقة الأصدقاء؟
لقد أنشأنا صداقة John مع Julia (
friend(john, julia)
) ، لكن بالنسبة لـ Prolog هذا لا يعني أن Julia صديق مع John: أنت بحاجة إلى إضافة
friend(julia, john)
حقيقة آخر
friend(julia, john)
. لقد أشرنا أيضًا إلى من لديه أطفال ومن الواضح أنه لا يريد تكرار الكود ، مع الإشارة بشكل منفصل إلى والدي كل طفل. نحن لا نريد أن نكتب شيئا مثل
child(brad, alfred). child(john, jim). child(john, mary). parent(alfred, brad). parent(jim, john). parent(mary, john).
يساعد Prolog على تجنب الازدواجية مع قواعد الاستنتاج المنطقي:
rule :- stmt1, stmt2,...
القاعدة صحيحة إذا كانت جميع العبارات الداخلية صحيحة (مدرجة ومطوية منطقياً بفاصلة).
friend(X, Y) :- friend(Y,X). parent(X, Y) :- child(Y,X). father(X, Y) :- child(Y,X), male(X). mother(X, Y) :- child(Y,X), female(X). friendzoned(X) :- loves(X, Y), \+ loves(Y,X).
friend(X,Y)
صحيح friend(Y,X
)parent(X,Y)
صحيحًا عند تعيين child(Y,X)
father(X,Y)
صحيح مع parent(X,Y)
ومجموعة male(X)
mother(X,Y)
صحيحة عندما يتم تعيين parent(X,Y)
female(X)
friendzoned(X)
صحيح إذا أحب X SOMEONE Y
و Y لا يحب X (لاحظ المتغير المخفي Y؟)
?- friend(julia, john). true . ?- male(jim). true. ?- parent(jim,X). X = john. ?- father(jim, X). X = john. ?- mother(X, john). X = marry. ?- mother(marry,X). X = john. ?- mother(marry, john). true. ?- loves(julia, X). X = sam. ?- friendzoned(julia). false. ?- friendzoned(john). true.
حسنا ، الآن لدينا كل المعرفة اللازمة. دعونا ممارسة على تلوين الخريطة.
تلوين البطاقة
لنبدأ بالمشكلة الرياضية المعروفة. مطلوب أن لا توجد مناطق مجاورة لها نفس اللون.
لذلك ، يجب أن يكون المنطق هكذا ، لدينا ثلاثة أشياء:
- المتغيرات هي المناطق التي نريد تلوينها: A ، B ، C ، D ، E.
- المجال - مجموعة من القيم التي يمكن تعيينها للمتغيرات: الأحمر والأزرق والأخضر.
- القيد هو أن المناطق المجاورة لا يمكن أن تكون بنفس اللون.
المجال
حدد مجال مناطقنا (الأحمر والأخضر والأزرق).
color(red). color(green). color(blue).
هذا كل شيء.
نحن نطلب حلا
colorify(A,B,C,D,E) :- color(A), color(B), color(C), color(D), color(E), \+ A=B, \+ A=C, \+ A=D, \+ A=E, \+ B=C, \+ C=D, \+ D=E.
نحن هنا نعرّف الحل كقاعدة
colorify
بخمسة متغيرات A و B و C و D و E ، وداخل القاعدة
colorify
لون المجال (الأحمر والأزرق والأخضر) للمتغيرات
colorify
القيود التي لا تساوي A مع B ، ولا تساوي C ... و الخ
\+ X=Y
تعني أن X لا تساوي Y
سيستمر Prolog في إنشاء القيم حتى يجد خيارًا يرضي القاعدة بالقيود.
?- [mapcoloring] | . true. ?- colorify(A,B,C,D,E) | . A = red, B = D, D = green, C = E, E = blue ; A = red, B = D, D = blue, C = E, E = green ; A = green, B = D, D = red, C = E, E = blue ; A = green, B = D, D = blue, C = E, E = red ; A = blue, B = D, D = red, C = E, E = green ; A = blue, B = D, D = green, C = E, E = red
color(red). color(green). color(blue). colorify(A,B,C,D,E) :- color(A), color(B), color(C), color(D), color(E), \+ A=B, \+ A=C, \+ A=D, \+ A=E, \+ B=C, \+ C=D, \+ D=E.
... لكننا لسنا تلوين الصور هنا ، ولكننا نبحث عن القاتل.
القتل
أولاً ، تخيل المشتبه بهم. هناك ثلاثة رجال (جورج ، جون ، روبرت) وثلاث نساء (باربرا ، كريستينا ، يولاندا). كل شخص في غرفة منفصلة (حمام ، غرفة طعام ، مطبخ ، غرفة معيشة ، مخزن ، مكتب). تم العثور على أسلحة مشبوهة في كل غرفة (حقيبة ، سلاح ناري ، غاز ، سكين ، سم ، حبل).
من وجد في المطبخ؟
المجال
من هذا يمكننا أن نستنتج أن لدينا خمسة مجالات:
man
،
woman
،
person
أو المشتبه فيه ،
location
weapons
، ومتغيراتنا (A ، B ، C ، D ، E ، F) يجب أن تمثل كل من الشخص والمكان والسلاح مع بعض القيود التي سيتم الكشف عنها في النصائح القادمة.
man(george). man(john). man(robert). woman(barbara). woman(christine). woman(yolanda). person(X):- man(X). person(X):- woman(X). location(bathroom). location(dining). location(kitchen). location(livingroom). location(pantry). location(study). weapon(bag). weapon(firearm). weapon(gas). weapon(knife). weapon(poison). weapon(rope).
uniq_ppl
القاعدة
uniq_ppl
قيمًا فريدة للمتغيرات الخاصة بنا.
uniq_ppl(A,B,C,D,E,F):- person(A), person(B), person(C), person(D), person(E), person(F), \+A=B, \+A=C, \+A=D, \+A=E, \+A=F, \+B=C, \+B=D, \+B=E, \+B=F, \+C=D, \+C=E, \+C=F, \+D=E, \+D=F, \+E=F.
الحل
نبدأ بتعريف حكم القاتل بأشخاص فريدين في أماكن وأشخاص فريدون يحملون أسلحة ، وسوف نشير الآن إلى العلاقة بين الأشخاص في أماكن مع من لديهم أسلحة
يرجى ملاحظة أنه لا يزال لدينا ستة مشتبه بهم.
الدخول
murderer(X) :- uniq_ppl(Bathroom, Dining, Kitchen, Livingroom, Pantry, Study), uniq_ppl(Bag, Firearm, Gas, Knife, Poison, Rope),
للتحدث بسهولة عن المتغيرات ، مثل الحمام وغرفة الطعام والأسلحة النارية والغاز ، نحدد على الفور:
- الحمام - هو نفس المشتبه به (ذكرا أو أنثى) في الحمام
- الأسلحة النارية - إنها نفس المشتبه به (ذكراً كان أم أنثى) بسلاح ناري
- وهكذا ... يمكنك أن تتخيلها كشبكة
الآن نواصل إضافة قيود بعد الفاصلة الأخيرة في حكم
murderer
.
نصيحة 1
مع وجود رجل في المطبخ ، لا يوجد حبل أو سكين أو حقيبة. السلاح ليس سلاحا ناريا. ما هي الأسلحة الموجودة في المطبخ؟
% 2. Clue 1: The man in the kitchen was not found with the rope, knife, or bag. % Which weapon, then, which was not the firearm, was found in the kitchen? man(Kitchen), \+Kitchen=Rope, \+Kitchen=Knife, \+Kitchen=Bag, \+Kitchen=Firearm,
نقول هنا أن متغير
Kitchen
يرضي حقيقة
man
(المحدد في مجالنا) ، ونعلن أنه بغض النظر عن الشخص الموجود في المطبخ ، فإنه ليس لديه أي مما يلي:
Rope
،
Knife
،
Bag
،
Firearm
.
تلميح 2
تلميح 2. باربرا إما في الدراسة أو في الحمام ، ويولاندا في آخر من الغرفتين المسمىتين. في أي غرفة وجدت باربرا؟
وبالتالي ، يمكننا أن نقول أن هناك
woman
في المكتب وفي الحمام ، وهذا ليس كريستينا ، ونحن أيضا شطب الخيارات الأخرى لباربرا ويولاندا (المطبخ ، غرفة الطعام ، غرفة المعيشة ، مخزن).
% % 3. Clue 2: Barbara was either in the study or the bathroom; Yolanda was in the other. % % Which room was Barbara found in? woman(Bathroom), woman(Study), \+christine=Bathroom, \+christine=Study, \+barbara=Dining, \+barbara=Kitchen, \+barbara=Livingroom, \+barbara=Pantry,
نصيحة 3
الرجل الذي يحمل الكيس ليس باربرا ولا جورج ، ولم يكن في الحمام ولا في غرفة الطعام. من كان لديه الحقيبة؟
% % 4. Clue 3: The person with the bag, who was not Barbara nor George, was not in the bathroom nor the dining room. % % Who had the bag in the room with them? \+barbara=Bag, \+george=Bag, \+Bag=Bathroom, \+Bag=Dining,
نصيحة 4
تم العثور على امرأة بحبل في المكتب. من هذا
% % 5. Clue 4: The woman with the rope was found in the study. % % Who had the rope? woman(Rope), Rope=Study,
نصيحة 5
نصيحة 5. السلاح في غرفة المعيشة ينتمي إلى جون أو جورج. أي نوع من الأسلحة في غرفة المعيشة؟
man in Livingroom Livingroom isn't robert % % 6. Clue 5: The weapon in the living room was found with either John or George. % % What weapon was in the living room? man(Livingroom), \+Livingroom=robert,
نصيحة 6
لم يكن هناك سكين في غرفة الطعام. أين كان السكين؟
% % 7. Clue 6: The knife was not in the dining room. % % So where was the knife? \+Knife=Dining,
نصيحة 7
تلميح 7. Yolanda لم يكن في المكتب ولا في مخزن. ما السلاح الموجود في غرفة يولاندا؟
% % 8. Clue 7: Yolanda was not with the weapon found in the study nor the pantry. % % What weapon was found with Yolanda? \+yolanda=Pantry, \+yolanda=Study,
نصيحة 8
وجد جورج سلاحا ناريا.
% % 9. Clue 8: The firearm was in the room with George. % % In which room was the firearm found? Firearm=george,
نصيحة 9
وقد اكتشف أن السيد بودي قد تعرض للغاز في المخزن. المشتبه به في تلك الغرفة كان قاتل. من هذا
% % 10. It was discovered that Mr. Boddy was gassed in the pantry. The suspect found in that room was the murderer. % % Who, then, do you point the finger towards? Pantry=Gas, Pantry=X, write("KILLER IS :"), write(X), nl, writeanswers(Bathroom, Dining, Kitchen, Livingroom, Pantry, Study, Bag, Firearm, Gas, Knife, Poison, Rope).
تطابق الغاز ، ومخزن ، والقاتل ، ثم استخدم
write
writeanswers
.
writeanswers(Bathroom, Dining, Kitchen, Livingroom, Pantry, Study, Bag, Firearm, Gas, Knife, Poison, Rope):- write("Bathroom: "), write(Bathroom), nl, write("Dining: "), write(Dining), nl, write("Livingroom: "), write(Livingroom), nl, write("Pantry: "), write(Pantry), nl, write("Study: "), write(Study), nl, write("Kitchen: "), write(Kitchen), nl, write("Knife: "), write(Knife), nl, write("Gas: "), write(Gas), nl, write("Rope: "), write(Rope), nl, write("Bag: "), write(Bag), nl, write("Poison: "), write(Poison), nl, write("Firearm: "), write(Firearm), nl.
من هو القاتل؟
?- [crime2]. true. ?- murderer(X). KILLER IS :christine Bathroom: yolanda Dining: george Livingroom: john Pantry: christine Study: barbara Kitchen: robert Knife: yolanda Gas: christine Rope: barbara Bag: john Poison: robert Firearm: george X = christine ;
يتم نشر الرمز
هنا . ربما كان يمكن أن يكون أفضل بكثير لأنني لست خبيرا في Prolog :)