Comment écrire correctement l'effet axiome pour vide (B, T) -Action à l'aide du prédicat contient (B, L, T) Le prédicat évalue true, si le godet B contient des litres d'eau au moment t.
Vide (B, T): Vide complètement le godet B au moment t. L'effet du transfert est visible à l'heure t + 1 p>
transfert (B, B ', T): transfère autant d'eau du godet B sur le godet B' dans la mesure du possible sans dépasser à partir du temps t. L'effet du transfert est visible à l'heure t + 1. P>
godet 1 est rempli d'eau et contient 7 litres. Le godet 2 est vide et contient 3 litres. L'état cible est que B2 contient 1 litre d'eau. P>
Je dirais que la solution correcte est la suivante: p> serait-ce correct ou devrais-je Définissez la quantité de litres sur L = 5, par exemple? p> p>
3 Réponses :
Je pense que la réponse serait:
Cela a du sens, pourriez-vous expliquer votre déclaration? Et quel livre utilisez-vous comme référence?
Pour ce problème, une durée explicite n'est pas nécessaire, nous allons donc représenter l'histoire comme liste d'actions. D'autre part, vous devez explicitement représenter l'état de votre système, c'est-à-dire le contenu actuel des trois godets. La raison est que les données de données de prolog (c'est-à-dire des termes) ne peuvent pas être modifiées, une fois qu'ils sont créés. Comme il y a beaucoup de termes sans signification, il est une bonne pratique de définir les fichiers de données d'abord via un is_type / 1 code> prédicat. Parce que vous utiliserez des arithmétiques à un moment donné (lorsque vous verrez de l'eau d'un seau à un autre), je vais utiliser des contraintes arithmétiques au lieu de l'ancien
IS / 2 code> prédicat.
S1 = buckets(0, 0, 5),
H1 = empty(b1),
H2 = empty(b2) ;
S1 = buckets(0, 3, 0),
H1 = empty(b1),
H2 = empty(b3) ;
S1 = buckets(0, 0, 5),
H1 = empty(b2),
H2 = empty(b1) ;
S1 = buckets(7, 0, 5),
H1 = H2, H2 = empty(b2) ;
S1 = buckets(7, 0, 0),
H1 = empty(b2),
H2 = empty(b3) ;
S1 = buckets(0, 3, 0),
H1 = empty(b3),
H2 = empty(b1) ;
S1 = buckets(7, 0, 0),
H1 = empty(b3),
H2 = empty(b2) ;
S1 = buckets(7, 3, 0),
H1 = H2, H2 = empty(b3).
Je quitte l'ancienne réponse car il laisse certaines parties à penser (et la question concerne la mise en œuvre de l'action vide uniquement). Juste pour fournir une mise en œuvre complète aussi:
?- L = [pour(b1, b3), pour(b1, b2), empty(b1), pour(b1, b3)], state_goesto_action(_, S, L). L = [pour(b1, b3), pour(b1, b2), empty(b1), pour(b1, b3)], S = buckets(5, 0, 1) ; false.
Au moins pour Prolog, votre question n'a pas de sens. Essayez de le formaliser dans un langage de programmation, d'obtenir un indice.
Peut-être devriez-vous expliquer en premier, ce que B, T et L représentent et ce que la règle est censée faire. En supposant que T est un point à temps, B signifie un godet et L est une quantité d'eau (en litres), vous indiquez: «Si à un moment donné T, tout godet est vide, alors n'importe quel godet a une quantité arbitraire d'eau». Mais alors une instance de votre axiome est "au temps t, si le godet B est vide, le godet B contient 100 litres d'eau." qui est une contradiction. Comme les axiomes contradictoires prouvent quoi que ce soit, vous ne devriez pas les utiliser.
@ Capellic @ lambda.xy.x a mis à jour le problème pour une meilleure compréhension.