2010-12-10 3 views
4

J'applique une variante à l'énigme d'Einstein et j'ai des problèmes.Éléments uniques dans la liste (Prolog)

Lorsque vous essayez de calculer la solution i essayer ceci:

solve(Street) :- Street = [_House1,_House2,_House3,_House4,_House5], 
%hint one goes here 
%hint two goes here 
%etc. 

Je peux alors demander à la solution en tapant: résoudre (Street)

Cependant cela vient comme solution:

  1. maison (fleur, nourriture, animal de compagnie, sport)
  2. maison (fleur, nourriture, animal de compagnie, sport)
  3. maison (x, nourriture, animaux, sport)
  4. maison (fleur, nourriture, animaux, sport)
  5. maison (x, fleur, animal, sport)

Comme vous pouvez voir il y a 2 fois x, le reste sont tous les types d'aliments, fleurs, animaux domestiques et sportifs. Mais chaque type est unique: si une personne aime fleur X, personne d'autre ne peut que X.

Maintenant, la raison pour laquelle ma solution donne 2 x de est facile à voir: on nous donne une quantité de notes, mais dans tous les conseils il n'y a que 4 fleurs mentionnées. Alors Prolog ne sait pas qu'il y a une autre fleur, et utilise x seulement deux fois, juste parce que c'est possible et remplit tous les autres indices. Ce que je veux dire, c'est que tous les types d'aliments et de fleurs, etc. dans Street sont uniques, donc il devrait laisser un peu vide quand il utilise déjà tous les types. 3 ressemblerait à: house(x , food, pet ,sport) et 5 ressemblerait à: house(_, flower, pet, sport).

J'ai aussi essayé d'ajouter ceci aux conseils: (disons « cactus » est l'une des fleurs ne sont pas mentionnées dans les notes) member(house(cactus,_,_,_), Street)

Cependant alors mon programme ne se termine pas ...

Un indice peut ressembler à ceci: is_neighbour(house(_,_,_,football),house(_,_,fish,_), Street), avec: is_neighbour(A,B,List) donnant true lorsque A et B sont l'un à côté de l'autre dans List. L'indice peut être traduit en: la personne qui aime le football vit à côté de la personne qui a du poisson.

Si plus d'informations doivent être fournies je suis prêt à élaborer. :)

Répondre

2

Pour exprimer qu'aucune fleur n'est signalée deux fois, et aussi pour s'assurer que toutes les fleurs sont liées, vous pouvez utiliser le prédicat permutation/2: la liste de toutes les fleurs doit être une permutation de la liste des fleurs spécifiées . Cela se lirait comme suit [non testé]

flowers([], []). 
flowers([house(Flower,_,_,_)|Street], [Flower|Rest]) :- flowers(Street, Rest). 

-- ... 
    flowers(Street, Flowers), 
    permutation(Flowers, [kaktus, tulpe, nelke, rose, fingerhut]), 

Modifier: pour 10 fleurs, en utilisant des permutations est probablement trop lent.Une approche alternative est

flower(kaktus). 
flower(tulpe). 
flower(nelke). 
--... 

     flowers(Street,[F1,F2,F3,F4,F5,F6,F7,F8,F9,F10]), 
     flower(F1), flower(F2), F1\=F2, 
     flower(F3), F3\=F1, F3\=F2, 
     flower(F4), F4\=F1, F4\=F2, F4\=F3, 
     --... 
+0

Cela ressemble à une réponse logique et compréhensible, mais je dois faire quelque chose de mal .. J'ai ajouté toutes les fleurs dans la deuxième liste de permutation. Je mets aussi des 'fleurs (Street, Flowers)' et la permutation '' the solve (Street) '. Mais maintenant, ça ne semble pas finir. (habituellement, cela se termine dans les 5 minutes, mais maintenant il a été plus de 15 minutes.) Est-ce que cela importe où je mets la «permutation»? – Aerus

+0

La permutation devrait être symétrique pour les deux arguments, donc l'échange des arguments ne devrait pas aider. Placer l'appel de permutation dans un endroit différent devrait cependant vous aider beaucoup: vous devez d'abord mettre les conditions qui limitent le plus l'espace de solution. Mettez des appels en écriture pour que l'on puisse voir ce qu'il fait. –

+0

Quand je mets un appel (write()) autour de la permutation à la fin des indications qu'il donne: permutation ([géranium, hyacint, ** lelie **, dahlia, ** lelie **], [cactus, lelie, géranium, hyacint, dahlia]). Quand je le mets en face de tous les indices qu'il me donne: permutation ([_ 46, _53, _60, _67, _74], [cactus, lelie, géranium, hyacint, dahlia]). Je ne suis pas sûr de ce que cela veut dire en premier. La sortie me donne encore 2 x mais ça se termine maintenant. Dois-je aussi ajouter des permutations pour les autres types afin que cette permutation unique fonctionne? – Aerus

Questions connexes