Test de langage de programmation pseudo-naturel

Salut,

Je suis en train de lire un livre sur Inform6 (celui avec Guillaume Tell), et parallèlement, voici pèle-mèle ce que j’ai envie d’essayer d’implémenter en ce moment :


un sujet est une liste d'aspects instanciés

un aspect est un type de variable associé à des phrases de manipulation



# Le sujet "animal" (masculin)

Par nature :
- Il a un certain âge.
- Il a un état de santé.



# Le sujet "humain" (masculin)

C'est :
- un animal

Par nature :
- Il porte un nom.



# Le sujet "Batman" (nom propre, masculin)

C'est :
- un humain

Par nature :
- Le nom de Batman est Bruce.



# Le nombre "âge"

Pour le définir :
- SUJET1 a maintenant <N> an[s].

Pour le déclarer :
- SUJET1 a un certain âge.

Pour l'évoquer :
- l'âge de SUJET1



# Le texte "nom"

Pour le définir :
- SUJET1 s'appelle maintenant <T>.

Pour le déclarer :
- SUJET1 porte un nom.

Pour l'évoquer :
- le nom de SUJET1



# L'état "santé"

Pour le déclarer :
- SUJET1 est vivant.

Pour le définir :
- SUJET1 est maintenant <E>.

Il peut être :
- en bonne santé
- malade
- blessé[e]
- mort[e]

Pour l'évoquer :
- l'état de santé de SUJET1



# Le lien "appartenance"

Pour le définir :
- SUJET2 appartient maintenant à SUJET1.
- SUJET1 possède maintenant SUJET2.

Pour le déclarer :
- SUJET2 appartient à quelqu'un.
- SUJET1 peut posséder des choses.

Pour l'évoquer :
- le[s] propriétaire[s] de SUJET2
- ce que possède SUJET1



# L'état indépendant "météo" [féminin]

Il peut être :
- ensoleillé
- nuageux
- orageux
- il pleut

Pour l'évoquer :
- le temps

Pour évoquer "il pleut" :
- il pleut



# Le texte indépendant "élément de la liste des courses"

Pour en définir un :
- Il faut acheter <T>.

Pour en supprimer un :
- Plus besoin d'acheter <T>.

Pour l'évoquer
- l[a|es] chose[s] à acheter



# L'action "mettre SUJET2 en état d'arrestation"

Si SUJET1 n'est pas un humain, ou si SUJET2 n'est pas un humain :
    cette action est terminée ;
    c'est tout.
Si SUJET2 possède une arme :
    SUJET1 doit désarmer SUJET2 ;
    c'est tout.
SUJET1 doit passer les menottes à SUJET2.
SUJET1 doit lire ses droits à SUJET2.
SUJET2 est maintenant en état d'arrestation.



# L'action "faire les courses"

SUJET1 doit aller au supermarché.
Le nombre local "la facture" est maintenant 0.
Pour chaque élément de la liste des courses :
    SUJET1 doit prendre la chose à acheter ;
    La facture est maintenant ((la facture) + (le prix de la chose à acheter)).
    C'est tout.
SUJET1 doit passer à la caisse.
Le porte-monnaie de SUJET1 est maintenant ((le porte-monnaie de SUJET1) - (la facture)).
SUJET doit rentrer à la maison.



# Le lien "parent-enfant"

Pour en définir un :
- SUJET1 est maintenant le père de SUJET2.
- SUJET1 est maintenant la mère de SUJET2.
- SUJET2 est maintenant le fils de SUJET1.
- SUJET2 est maintenant la fille de SUJET1.

Pour l'évoquer :
- l['|es ]enfant[s] de SUJET1
- le[s] parent[s] de SUJET2



# L'action "offrir un cadeau de noël aux enfants de SUJET2"

Pour tous les enfants de SUJET2 :
  SUJET1 doit offrir un cadeau à l'enfant ;
  c'est tout.

Ca reste pour l’instant un modèle d’exécution très basique, impératif, avec des objets (les « sujets ») qui ne sont finalement que des structures de variables. Je bidouille, je cogite… Si cela vous inspire des commentaires… :slight_smile:

Je n’aime pas du tout, car tout est fait d’exceptions. Pour chaque aspect, il faut dire comment la déclarer ou la modifier, par exemple. Ce serait bien plus facile d’avoir une instruction générale, comme :

maintenant le|la|l'|les (aspect) de/du/des (sujet) est (nouvel aspect).

C’est aussi très lourd, avec beaucoup de choses à écrire. Il y a également des incohérences dans ton code. Par exemple, tu dis pour l’animal « il a un état de santé », alors que plus bas tu indique qu’il faut écrire « X est vivant » pour déclarer une santé.

Enfin, quel est le rapport avec Inform 6 ? Si ce genre de code naturel t’intéresse, tu devrait carrément essayer Inform 7 ! J’ai refait ton exemple avec I7, pour te montrer ce que ça pourrait donner (je ne sais pas si tout fonctionne, car c’était impossible à tester : ton exemple contenait trop de choses non définies) :

[code]Part 1 - Animal

Un animal is a kind of thing.

An animal has a durée called âge.
In French être agé de is a verb meaning the âge property.

An animal has a santé called état de santé.

Part 2 - Humain

Un humain is a kind of animal.

Un humain has a text called nom.
In French s’appeler is a verb meaning the nom property.

Part 3 - Batman

Batman est un humain.

Le nom de Batman est « Bruce ».

Part 4 - Durée

[Pour définir les âges.]

A durée is a kind of value.
1 an (singulier) spécifie une durée.
2 ans (pluriel) spécifie une durée.

Part 5 - Nom

[Rien à faire, car tout est géré par Inform (déclaration, etc.).]

Part 6 - Santé

La santé is a kind of value. Les santés sont mort, blessé, malade et en bonne santé.

Part 7 - Appartenance

Appartenance relates various choses to one humain (called le propriétaire).
In French appartenir à is a verb meaning the appartenance relation.
In French posséder is a verb meaning the reverse appartenance relation.

Part 8 - Météo

La météo is a kind of value. Les météos sont orageux, pluvieux, nuageux et ensoleillé.

Le temps actuel est une météo qui varie.

Part 9 - Liste de course

Les choses à acheter est une liste de textes qui varie.

[Et encore, c’est juste pour faire joli, on aurait juste pu juste utiliser l’instruction ajouter blabla à la liste de course à la place de définir celle-ci, qui fait exactement la même chose.]
To il faut acheter (T - un texte):
ajouter T aux choses à acheter, si absent.

To plus besoin d’acheter (T - un texte):
retirer T des choses à acheter, si présent.

Part 10 - Mettre quelqu’un en état d’arrestation

[Ici, je ne sais pas trop quoi faire, car l’action de mettre en état d’arrestation ne mentionne pas le SUJET1, et « passer les menottes », « désarmer », etc. n’ont pas été définis.]

To mettre (H - un humain) en état d’arrestion:
Si H possède une arme :
SUJET1 doit désarmer H ;
SUJET1 doit passer les menottes à H.
SUJET1 doit lire ses droits à H.
H est maintenant en état d’arrestation.

Part 11 - Faire les courses

To (H - un humain) doit faire les courses:
essayer H going to le supermarché;
let facture be 0;
répéter avec X parcourant les choses à acheter:
try H taking X;
ajouter le prix de la chose à acheter à la facture;
[H doit passer à la caisse : n’a pas été défini];
enlever la facture au porte-monnaie de H;
[H doit aller dans la maison : n’a pas été défini.]

Part 12 - Parent-enfant

[Il faudrait faire une relation semblable à l’appartenance.]

Part 13 - Offrir un cadeau

[Analogue à mettre quelqu’un en état d’arrestation et à acheter des choses.][/code]
Il reste des trucs en anglais, mais on ne peut pas faire autrement pour l’instant.

En gros :

  • sujet => objet
  • aspect => propriété d’un certain type, lié à un objet
  • lien => relation
  • état => kind of value (c’est à dire un type qui peut prendre un nombre fini de valeurs, comme la santé ou la météo)
  • action => action, ou bien une nouvelle instruction (phrase dans le jargon I7)

Et l’état du monde dans un jeu Inform à un moment donné n’est défini que par les trois premiers éléments : il y a des objets qui ont certaines propriétés de certains type, et sont en relation entre eux (appartenance, emplacement, etc.).

Du coup, je ne sais pas trop quel est ton but, mais pour l’instant, ça ressemble à Inform 7, et Inform 7 le fera vraisemblablement mieux. Ça ne servirait à rien de réinventer la roue, sauf si I7 n’est pas utilisable dans ton cas (pour un MUD par exemple). Mais tu devrait lire la documentation d’I7 (ou notre tuto), ça pourrait te donner des idées.

Hou Natrium, j’aime quand tu me claques la fesse comme ça.

D’abord merci d’avoir pris le temps d’étudier mon bout de code pour rédiger une réponse construite. Et pardon pour l’incohérence au niveau de l’état de santé que tu as immédiatement identifié : effectivement j’ai changé d’avis en mettant « … est vivant » et j’ai oublié de mettre à jour le reste en conséquence.

Le seul rapport avec Inform6, c’est la coincidence temporelle. J’ai déjà lu des choses sur Inform7, et là je suis en train de lire ce livre sur Inform6. Cela a probablement déclenché une envie en moi, mais rien de plus.

Pourquoi ? juste parce que je prends plaisir à faire ce genre de choses, créer des langages formels, tout ça quoi. Un dérivé de ce travail pourrait se retrouver dans MAVH II, je suppose.

Je vais lire le tuto Inform7 de IFiction-FR, je te remercie de me le proposer.

Il y a cette petite phrase que j’aime beaucoup dans ce que tu as écrit : « tout est fait d’exceptions ». C’est génial ! Mais si tout est exception, peut-on encore parler d’exceptions ?

Je comprends. C’est vrai que c’est cool de créer un langage. Quand j’écris un FI, il m’arrive de prendre plus de plaisir à coder le système de jeu que de créer le monde et écrire le texte.

Hmm… Je crois que tu m’as eu ! :angry: Si tu préfères, on peut dire qu’il n’y a pas de généralité ; pour chaque chose que tu crées, il faut spécifier comment elle fonctionne. Enfin bref, on se comprend, n’est-ce pas ? Pas besoin d’entrer dans le débat philosophique ! :wink:

Pour améliorer ce que tu as fait, il faudrait le rendre moins verbeux (l’un des pires truc pour moi, c’est le « c’est tout »). Après, on retomberait sur un genre de langage orienté-objet, et il en existe déjà plein. Il faudrait se poser la question : « Qu’est-ce qui rend mon langage différent des autres, pour quoi est-il approprié ? »

Merci pour tes précieux conseils. Je les ai suivis pour créer une nouvelle version, beaucoup moins verbeuse tout en restant assez natuelle. J’ai laissé tomber le côté prototype-based, pour m’orienter vers un simple stock de variables à manipuler, qu’il est toutefois possible de rattacher à un sujet.

Je tiens à préciser que le « terminer » dans l’action de boire à la gourde n’est pas la fin du « si » mais une sortie prématurée de procédure :stuck_out_tongue: Un « si » se termine par un point, et on ne peut plus imbriquer les « si ».

Voici un extrait :


€ boire à la gourde >
  Si le contenu de la gourde est 0 : Ajouter "Votre gourde est vide !" ; terminer.
  Le contenu de la gourde diminue de 1.
  La soif du joueur diminue de 1.
  Ajouter "Vous buvez de l'eau de votre gourde."
  


# Univers

- Le sujet "le joueur"
- Le sujet "Furax le chien"
- Le nombre "la soif du sujet".
- La liste "l'équipement du sujet".
- Le texte "l'état de santé du sujet".
- Le nombre "le contenu de la gourde".



# Prime

Vous êtes dans une jolie clairière. [v|la description de la gourde]
[r|Au nord], vous entendez le bruit d'une cascade.

@ UNE FOIS AVANT >
  La description de la gourde est "Au milieu de la clairière, vous voyez [r|une gourde].".

@ une gourde >
  Une gourde fait partie de l'équipement du joueur.
  La description de la gourde est supprimée.
  Ajouter "Vous prenez la gourde".

@ Au nord >
  Aller vers la cascade.



# La cascade

Il y a de l'eau ici. [v|la possibilité de faire le plein]

[v|le chien buvant]

@ AVANT >

  Si la soif de Furax le chien est supérieure à 2 :
    le chien buvant est "Furax en profite pour boire un peu." ;
    la soif de Furax le chien est 0.
    
  Si une gourde fait partie de l'équipement du joueur :
    la possibilité de faire le plein est "Vous pouvez [r=1|remplir votre gourde].".

@ 1 >
  Le contenu de la gourde est 10.
  Ajouter "Vous remplissez votre gourde".