2016-07-05 1 views
1

J'ai plusieurs faits Prolog indiquant que quelque chose ou quelqu'un est une personne, un lieu ou un objet. J'ai une clause go (personne, lieu) qui indique qu'une personne déménage d'où elle est à l'endroit indiqué dans la clause. Cependant, quand je demande à la requête pertinente de savoir si quelqu'un est à un certain endroit, Prolog répond avec chaque personne qui était là selon les clauses. Comment puis-je écrire une règle qui dit que si vous êtes dans un endroit, vous n'êtes par définition pas dans les autres?Règles Prolog pour les petits environnements

+0

style ancien était à 'update_person_pos (Pers, Pos): - Rentrer (personne (Pers, _OLD)), affirmer (personne (Pers, Pos)). ' – CapelliC

Répondre

3

Il semble que vous ayez omis un aspect important lors de la modélisation de la situation en tant que faits Prolog: Lorsque est-il allé à l'emplacement?

Supposons que vous aviez au lieu des faits de la forme:

 
person_went_to_at(Person, Location, Time). 

alors il serait assez facile de déterminer, pour tout moment, où tout le monde était, et où ils se sont déplacés   pour durer (et, par conséquent , sont   maintenant).

0

Vous avez probablement besoin d'ajouter des informations de synchronisation à vos faits. Imaginez la situtation suivante:

go(dad, kitchen, bathroom). 
go(dad, bathroom, garage). 
go(dad, garage, kitchen). 

Depuis Prolog est (plus ou moins) déclarative, dans ce cas, l'ordre réel des faits dans le dossier n'a pas d'importance. Donc, vous ne pouvez pas conclure que papa est dans la cuisine, il pourrait avoir commencé et est retourné au garage. Même si vous ajoutez une sorte de prédicat de départ, par exemple startLoc(dad, kitchen), cela n'aide pas avec les boucles (par exemple lorsque vous ajoutez go(dad, kitchen, outside) aux règles ci-dessus).

Si vous ajoutez des informations de synchronisation (et quitter la salle précédente, comme cela ressort clairement de l'information temporelle), cela devient:

go(dad, bathroom,1). 
go(dad, garage,2). 
go(dad, kitchen,3). 

Les chiffres réels ne sont pas pertinents, juste leur ordre. Vous pouvez maintenant obtenir le dernier endroit en veillant à ce qu'il n'y a pas plus tard commande "go" avec papa:

location(X, Y) :- go(X, Y, T), \+ (go(X, _, T2), T2 > T).