Auf der Suche nach dem Mörder auf Prolog

Jeden Sonntag in unserer Firma ist es ĂŒblich, lustige Quiz zu arrangieren, dies ist eines davon.

RĂ€tsel


Um Mr. Boddys Mörder zu finden, mĂŒssen Sie herausfinden, wo sich jede Person befand und welche Waffen sich im Raum befanden. Hinweise sind im gesamten Quiz verteilt (Sie können die erste Frage erst beantworten, wenn Sie alle zehn gelesen haben).

  • Stellen Sie sich zunĂ€chst die VerdĂ€chtigen vor. Es gibt drei MĂ€nner (George, John, Robert) und drei Frauen (Barbara, Christina, Yolanda). Jede Person befindet sich in einem separaten Raum (Bad, Esszimmer, KĂŒche, Wohnzimmer, Speisekammer, BĂŒro). In jedem Raum wurden verdĂ€chtige Waffen gefunden (Tasche, Schusswaffe, Gas, Messer, Gift, Seil). Frage: Wer wurde in der KĂŒche gefunden?
  • Tipp 1. Bei einem Mann in der KĂŒche gibt es weder ein Seil noch ein Messer oder eine Tasche. Die Waffe ist keine Schusswaffe. Frage: Welche Waffen wurden in der KĂŒche gefunden?

  • Tipp 2. Barbara ist entweder im Arbeitszimmer oder im Badezimmer, und Yolanda ist in einem anderen der beiden genannten RĂ€ume. In welchem ​​Raum fand Barbara?
  • Tipp 3. Der Mann mit der Tasche ist weder Barbara noch George, und er war weder im Badezimmer noch im Esszimmer. Wer hatte die Tasche?
  • Tipp 4. Im BĂŒro wurde eine Frau mit einem Seil gefunden. Wer ist das?
  • Tipp 5. Die Waffe im Wohnzimmer gehört entweder John oder George. Was fĂŒr eine Waffe im Wohnzimmer?
  • Tipp 6. Im Esszimmer war kein Messer. Wo war das Messer?
  • Tipp 7. Yolanda war weder im BĂŒro noch in der Speisekammer mit den entsprechenden Waffen fĂŒr diese RĂ€ume. Was fĂŒr eine Waffe hat Yolanda?
  • Tipp 8. George hat eine Schusswaffe gefunden. Welches Zimmer?
  • Es wurde festgestellt, dass Herr Boddy in der Speisekammer vergast wurde. Der VerdĂ€chtige in diesem Raum war ein Mörder. Wer ist das?

Ich stapfe auf solche RÀtsel (eigentlich aus fast allen RÀtseln). Sie könnten Stunden und Stunden des Nachdenkens brauchen, aber Prolog kommt immer zur Rettung! Mal sehen, wie es hilft, solche Probleme zu lösen.

Prolog 101


Installieren Sie 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 - swipl
  • write wird als Funktor bezeichnet, und die write/1 Darstellung bedeutet, dass 1 Argument erforderlich ist (dasselbe Konzept in Erlang und Elixir, um die Anzahl der Argumente zu einem Funktionsnamen hinzuzufĂŒgen).
  • nl verwendet, um eine neue Zeile zu drucken
  • Die Befehlsfolge wird durch Kommas getrennt, die auch den AND-Operator ersetzen
  • Dem Zuweisungsoperator folgt ein mathematischer Ausdruck
  • Variablen werden in Großbuchstaben X , nicht in x

Wissensbasis


Die Essenz von Prolog besteht darin, Tatsachen darzulegen, Tatsachen zusammenzustellen und sie anzufordern.

Erstellen der Datei 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). 

  • Wir verwenden [hello]. zum Laden [hello]. : Achten Sie auf den Punkt am Ende
  • listing listet alle Fakten in der Wissensdatenbank auf

 ?- [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. 

Anfrage nach Fakten


Nachdem wir die Fakten in der Wissensdatenbank angegeben haben, können wir weiter gehen und Fragen zur Wahrheit der Fakten stellen sowie zu den Schlussfolgerungen, die daraus gezogen werden können.

 ?- friend(john, julia). true . ?- friend(john, jack). true. ?- loves(john, julia). true. ?- loves(john, sam). false. 

Wir können komplexere Fragen stellen. Zum Beispiel, wer mit John befreundet ist oder wer Julia liebt.

 ?- 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. 

Ist John in der Freundeszone?


Wir haben Johns Freundschaft mit Julia ( friend(john, julia) Julia friend(john, julia) ) hergestellt, aber fĂŒr Prolog bedeutet dies nicht, dass Julia mit John befreundet ist: Sie mĂŒssen eine weitere Tatsachenfreundin friend(julia, john) Julia friend(julia, john) hinzufĂŒgen. Wir haben auch angegeben, wer Kinder hat und offensichtlich den Code nicht duplizieren möchte, wobei die Eltern jedes Kindes separat angegeben werden. Wir wollen so etwas nicht schreiben

 child(brad, alfred). child(john, jim). child(john, mary). parent(alfred, brad). parent(jim, john). parent(mary, john). 

Prolog hilft, Doppelarbeit mit logischen Schlussfolgerungen zu vermeiden:

 rule :- stmt1, stmt2,... 

Die Regel ist wahr, wenn alle internen Anweisungen wahr sind (aufgelistet und logisch mit einem Komma gefaltet).

 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) gilt fĂŒr friend(Y,X )
  • parent(X,Y) wahr, wenn child(Y,X)
  • father(X,Y) wahr father(X,Y) parent(X,Y) und male(X)
  • mother(X,Y) wahr, wenn parent(X,Y) und female(X)
  • friendzoned(X) wahr, wenn X SOMEONE Y liebt und Y X nicht liebt (beachte die versteckte Variable 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. 

Ok, jetzt haben wir alle notwendigen Kenntnisse. Lassen Sie uns das FĂ€rben der Karte ĂŒben.

KartenfÀrbung


Beginnen wir mit dem bekannten mathematischen Problem. Es ist erforderlich, dass keine angrenzenden Bereiche dieselbe Farbe haben.



Daher sollte die Argumentation so sein, wir haben drei Dinge:

  1. Variablen sind die Bereiche, die wir einfÀrben möchten: A, B, C, D, E.
  2. DomĂ€ne - Ein Wertebereich, der Variablen zugewiesen werden kann: Rot, Blau, GrĂŒn.
  3. Die EinschrÀnkung besteht darin, dass benachbarte Bereiche nicht dieselbe Farbe haben können.

Domain


Definieren Sie die DomĂ€ne unserer Regionen (rot, grĂŒn, blau).

 color(red). color(green). color(blue). 

Das ist alles.

Wir bitten um eine Lösung


 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. 

Hier definieren wir die Lösung als Regel mit fĂŒnf Variablen A, B, C, D, E kolorieren und innerhalb der Regel die DomĂ€nenfarbe (rot, blau, grĂŒn) fĂŒr die Variablen zuweisen und die EinschrĂ€nkungen festlegen, dass A nicht gleich B ist, nicht gleich C ... und usw.

\+ X=Y bedeutet, dass X nicht gleich Y ist

Prolog generiert weiterhin Werte, bis eine Option gefunden wird, die die Regel mit EinschrĂ€nkungen erfĂŒllt.

 ?- [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. 

... aber wir fÀrben die Bilder hier nicht aus, sondern suchen den Mörder.

Das Töten


Stellen Sie sich zunĂ€chst die VerdĂ€chtigen vor. Es gibt drei MĂ€nner (George, John, Robert) und drei Frauen (Barbara, Christina, Yolanda). Jede Person befindet sich in einem separaten Raum (Bad, Esszimmer, KĂŒche, Wohnzimmer, Speisekammer, BĂŒro). In jedem Raum wurden verdĂ€chtige Waffen gefunden (Tasche, Schusswaffe, Gas, Messer, Gift, Seil).

Wer wurde in der KĂŒche gefunden?

Domain


Daraus können wir schließen, dass wir fĂŒnf Bereiche haben: man , woman , person oder VerdĂ€chtiger, location und weapons , und unsere Variablen (A, B, C, D, E, F) sollten sowohl die Person als auch den Ort und die Waffe darstellen mit einigen EinschrĂ€nkungen, die in den kommenden Tipps offenbart werden.

 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). 

Die uniq_ppl Regel generiert eindeutige Werte fĂŒr unsere Variablen.

 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. 

Lösung


Wir definieren zunÀchst die Regel eines Mörders mit einzigartigen Menschen an Orten und einzigartigen Menschen mit Waffen und zeigen nun die Beziehung zwischen Menschen an Orten mit denen, die Waffen haben

Bitte beachten Sie, dass wir noch sechs VerdÀchtige haben.

Eintrag


 murderer(X) :- uniq_ppl(Bathroom, Dining, Kitchen, Livingroom, Pantry, Study), uniq_ppl(Bag, Firearm, Gas, Knife, Poison, Rope), 

Um leicht ĂŒber Variablen wie Badezimmer, Esszimmer, Schusswaffen und Gas zu sprechen, bestimmen wir sofort:

  • Badezimmer - es ist der gleiche VerdĂ€chtige (mĂ€nnlich oder weiblich) im Badezimmer
  • Schusswaffen - es ist der gleiche VerdĂ€chtige (mĂ€nnlich oder weiblich) mit einer Schusswaffe
  • und so weiter ... Sie können es sich als Gitter vorstellen

Jetzt fĂŒgen wir nach dem letzten Komma in der murderer weitere EinschrĂ€nkungen hinzu.

Tipp 1


Bei einem Mann in der KĂŒche gibt es kein Seil, Messer oder eine Tasche. Die Waffe ist keine Schusswaffe. Welche Waffen gibt es in der KĂŒche?

 % 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, 

Hier sagen wir, dass die Kitchen die Tatsache des man erfĂŒllt (definiert in unserer DomĂ€ne) und erklĂ€ren, dass unabhĂ€ngig davon, wer die Person in der KĂŒche ist, sie keine der folgenden Rope hat: Rope , Knife , Bag , Firearm .

Tipp 2


Tipp 2. Barbara ist entweder im Arbeitszimmer oder im Badezimmer, und Yolanda ist in einem anderen der beiden genannten RĂ€ume. In welchem ​​Raum fand Barbara?

Wir können also sagen, dass es eine woman im BĂŒro und im Badezimmer gibt, und das ist nicht Christina, und wir streichen auch die anderen Optionen fĂŒr Barbara und Yolanda durch (KĂŒche, Esszimmer, Wohnzimmer, Speisekammer).

 % % 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, 

Tipp 3


Der Mann mit der Tasche ist weder Barbara noch George, und er war weder im Badezimmer noch im Esszimmer. Wer hatte die Tasche?

 % % 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, 

Tipp 4


Im BĂŒro wurde eine Frau mit einem Seil gefunden. Wer ist das?

 % % 5. Clue 4: The woman with the rope was found in the study. % % Who had the rope? woman(Rope), Rope=Study, 

Tipp 5


Tipp 5. Die Waffe im Wohnzimmer gehört entweder John oder George. Was fĂŒr eine Waffe im Wohnzimmer?

 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, 

Tipp 6


Im Esszimmer war kein Messer. Wo war das Messer?

 % % 7. Clue 6: The knife was not in the dining room. % % So where was the knife? \+Knife=Dining, 

Tipp 7


Tipp 7. Yolanda war weder im BĂŒro noch in der Speisekammer. Welche Waffe ist in Yolandas Zimmer?

 % % 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, 

Tipp 8


George fand eine Schusswaffe.

 % % 9. Clue 8: The firearm was in the room with George. % % In which room was the firearm found? Firearm=george, 

Tipp 9


Es wurde festgestellt, dass Herr Boddy in der Speisekammer vergast wurde. Der VerdÀchtige in diesem Raum war ein Mörder. Wer ist das?

 % % 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). 

Passen Sie das Gas, die Speisekammer und den Killer an und verwenden Sie dann write , write zu write .

 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. 

Wer ist der Mörder?


  ?- [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 ; 

Der Code wird hier veröffentlicht . Es hĂ€tte wahrscheinlich viel besser sein können, da ich kein Experte fĂŒr Prolog bin :)

Source: https://habr.com/ru/post/de434172/


All Articles