2011-01-17 5 views
4

I „Learn Prolog Now“ und eine seiner Übungen, die ich in der Lage bin zu lesen haben, mich nicht zu lösen, ist die folgende:Solving Logik-Puzzle in Prolog

Es gibt eine Straße mit drei Nachbar ist Häusern, Alle haben eine andere Farbe. Sie sind rot, blau, und grün. Menschen verschiedener Nationalitäten leben in den verschiedenen Häusern und sie haben alle einen anderen Haustier. Hier sind einige weitere Fakten über sie:

* The Englishman lives in the red house. 
    * The jaguar is the pet of the Spanish family. 
    * The Japanese lives to the right of the snail keeper. 
    * The snail keeper lives to the left of the blue house. 

Who keeps the zebra? 

Define a predicate zebra/1 that tells you the nationality of the owner 

des Zebra.

Hint: Think of a representation for the houses and the street. Code 

die vier Einschränkungen in Prolog. Mitglied und Unterliste könnte nützlich sein Prädikate.

Irgendwelche Ideen, wie es unter Prolog zu codieren? Vielen Dank.

Antwort

7
neigh(Left, Right, List) :- 
     List = [Left | [Right | _]]; 
     List = [_ | [Left | Right]]. 

zebraowner(Houses, ZebraOwner):- 
     member([englishman, _, red], Houses), 
     member([spanish, jaguar, _], Houses), 
     neigh([_, snail, _], [japanese, _, _], Houses), 
     neigh([_, snail, _], [_, _, blue], Houses), 
     member([ZebraOwner, zebra, _], Houses), 
     member([_, _, green], Houses). 


zebra(X) :- zebraowner([_, _, _], X). 
1

Ich bin neu in Prolog, aber ich denke, dass die Definition von wiehern ist nicht ganz right.Try:

neigh(2,3,[1,2,3]). 

Sie weg mit dieser nicht ganz funktioniert, weil es zwei Lösungen, eine mit dem japanischen Zebra im zweiten Haus und einem mit dem Zebra im dritten Haus und dein Code findet nur einen (was genug ist, um die Frage zu beantworten :-). Dieser Code gibt die richtigen Antworten für wiehern und damit beiden Antworten auf das Problem:

neigh(Left, Right, List) :- 
     List = [Left, Right ,_]; 
     List = [_, Left, Right]]. 

aber dann funktioniert nur für drei Häuser. Eine allgemeinere Implementierung ist:

neigh(Left, Right, List) :- 
     List = [Left , Right | _]. 
neigh(Left, Right, [_|Tail]) :- 
     neigh(Left, Right, Tail).