11
votes

Axiome d'effet de formulation

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

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.

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.

Je dirais que la solution correcte est la suivante: xxx

serait-ce correct ou devrais-je Définissez la quantité de litres sur L = 5, par exemple?


3 commentaires

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.


3 Réponses :


1
votes

Je pense que la réponse serait: xxx


1 commentaires

Cela a du sens, pourriez-vous expliquer votre déclaration? Et quel livre utilisez-vous comme référence?



6
votes

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).


0 commentaires

4
votes

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.


0 commentaires