2016-08-13 3 views
1

J'essaie de résoudre l'énigme Einstein en utilisant Prolog. Tâche estPuzzle Einstein dans Prolog

  1. Le Norvégien vit dans la première maison.
  2. Les Anglais vivent à la Maison Rouge.
  3. Les chiens suédois HAS Comme animaux de compagnie.
  4. Le Danois boit du thé.
  5. La Maison verte est sur la gauche de la Maison Blanche.
  6. L'homme qui vit dans la serre boit du café.
  7. L'homme qui fume Pall Mall élève des oiseaux.
  8. L'homme qui habite la maison jaune fume Dunhill.
  9. L'homme qui vit dans la maison du milieu boit du lait.
  10. L'homme qui fume Blends vit à côté de celui qui a des chats.
  11. L'homme qui garde les chevaux vit à côté de celui qui fume Dunhill.
  12. L'homme qui fume le Blue Master boit de la bière.
  13. L'Allemand fume Prince.
  14. Le Norvégien vit à côté du côté de la Maison Bleue.
  15. L'homme qui fume Mélange est voisin de celui qui boit de l'eau.
  16. Quelqu'un a un aquarium avec des poissons.

Le programme:

neighbor(Rua):- 
    length(Rua, 5), 
    Rua = [casa(_,noruegues,_,_,_)|_], 
    member(casa(vermelha,ingles,_,_,_),Rua), 
    member(casa(_,sueco,_,_,cachorros),Rua), 
    member(casa(_,dinamarques,cha,_,_),Rua), 
    esquerda(casa(verde,_,_,_,_), casa(branca,_,_,_,_),Rua), 
    member(casa(verde,_,cafe,_,_),Rua), 
    member(casa(_,_,_,pallmall,passaros),Rua), 
    member(casa(amarela,_,_,dunhill,_),Rua), 
    Rua = [_,_,casa(_,_,leite,_,_),_,_], 
    ao_lado(casa(_,_,_,blends,_), casa(_,_,_,_,gatos),Rua), 
    ao_lado(casa(_,_,_,_,cavalos), casa(_,_,_,dunhill,_),Rua), 
    member(casa(_,_,cerveja,bluemaster,_),Rua), 
    member(casa(_,alemao,_,prince,_),Rua), 
    ao_lado(casa(_,noruegues,_,_,_), casa(azul,_,_,_,_),Rua), 
    ao_lado(casa(_,_,_,blends,_), casa(_,_,agua,_,_),Rua), 
    member(casa(_,_,_,_,peixes),Rua). 

ao_lado([X,Y|_],X, Y). 
ao_lado([X,Y|_],Y, X). 
ao_lado([_|L],X, Y):- 
    ao_lado(L, X, Y). 

esquerda([A|As], A, E) :- 
    member2(E, As). 
esquerda([_|As], A, E) :- 
    esquerda(As, A, E). 
+1

double possible de [Einstein Riddle avec Liste des termes] (http://stackoverflow.com/questions/36743498/einstein-riddle -with-list-of-terms) –

Répondre

5

Voici une raison que vous devez adresse pour résoudre ce problème. Le fragment de programme ci-dessous a beaucoup de buts enlevés, pourtant il échoue toujours. La partie visible seule est déjà responsable de l'échec. Pouvez-vous repérer la raison de ce fragment?

(Pour en savoir plus sur cette méthode voir this explication.)

 
:- op(950, fy, *). 
*_. 

:- initialization(neighbor(_Rua)). 

neighbor(_/*Rua*/):- 
    *length(Rua, 5), 
    *Rua = [casa(_,noruegues,_,_,_)|_], 
    *member(casa(vermelha,ingles,_,_,_),Rua), 
    *member(casa(_,sueco,_,_,cachorros),Rua), 
    *member(casa(_,dinamarques,cha,_,_),Rua), 
    esquerda(casa(_/*verde*/,_,_,_,_), _/*casa(branca,_,_,_,_)*/,Rua), 
    *member(casa(verde,_,cafe,_,_),Rua), 
    *member(casa(_,_,_,pallmall,passaros),Rua), 
    *member(casa(amarela,_,_,dunhill,_),Rua), 
    *Rua = [_,_,casa(_,_,leite,_,_),_,_], 
    *ao_lado(casa(_,_,_,blends,_), casa(_,_,_,_,gatos),Rua), 
    *ao_lado(casa(_,_,_,_,cavalos), casa(_,_,_,dunhill,_),Rua), 
    *member(casa(_,_,cerveja,bluemaster,_),Rua), 
    *member(casa(_,alemao,_,prince,_),Rua), 
    *ao_lado(casa(_,noruegues,_,_,_), casa(azul,_,_,_,_),Rua), 
    *ao_lado(casa(_,_,_,blends,_), casa(_,_,agua,_,_),Rua), 
    *member(casa(_,_,_,_,peixes),Rua). 

esquerda([A|As], _/*A*/, E) :- 
    *member(E, As). 
esquerda([_|As], A, E) :- 
    *esquerda(As, A, E).