2011-01-17 5 views
4

Je lis « Apprenez Prolog maintenant » et l'un de ses exercices que je ne l'ai pas pu me résoudre est la suivante:Solving puzzle logique Prolog

Il y a une rue avec trois maisons voisines tous ont une couleur différente de . Ils sont rouges, bleus, et verts. Les gens de différentes nationalités vivent dans les différentes maisons et ils ont tous un animal différent . Voici quelques faits à leur sujet :

* 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 

du zèbre.

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

les quatre contraintes dans Prolog. membre et sous-liste pourrait être utile prédicats.

Des idées pour le coder sous Prolog? Merci.

Répondre

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

Je suis nouveau à Prolog, mais je pense que la définition de hennissement est pas tout à fait right.Try:

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

Vous vous contenter de ce travail pas tout à fait parce qu'il ya deux solutions, un avec le zèbre japonais dans la deuxième maison, et un avec le zèbre dans la troisième maison et votre code n'en trouve qu'un (ce qui est suffisant pour répondre à la question :-). Ce code donne les bonnes réponses pour hennir et donc les réponses au problème:

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

mais ne fonctionne que pour trois maisons. Une implémentation plus générale est:

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