Java, objets, interfaces et Internet
TD 2

Interprète d'expressions logiques

On doit représenter les propositions logiques et effectuer un certain nombre de traitements sur celles-ci, par exemple, les évaluer, les imprimer de façon infixe, ou suffixe, etc. Une proposition est

  • soit un atome,
  • soit la conjonction de deux propositions,
  • soit la disjonction de deux propositions,
  • soit la négation d'une proposition ;
Un atome exprime l'énoncé d'un fait (vrai ou faux), par exemple "La mer est grise", que l'on représente par une chaîne de caractères. On transcrit cette définition en une hiérarchie de classes : la classe parente est une classe abstraite Prop, ses classes dérivées sont des classes concrètes Atome, Conj, Disj et Neg. Par exemple, on devra pouvoir écrire :


Prop p = new Disj(new Atome("La mer est grise"),
                  new Neg(new Atome("le temps est calme")))
  1. Transcrire cette grammaire en Java en définissant des types Prop, Atome, Conj, Disj et Neg. Pour l'instant, on indiquera seulement la relation d'extension entre ces différents types, leurs champs et les constructeurs assurant l'initialisation des champs. Les champs de ces classes seront privés.

  2. La méthode public String toString() permet d'obtenir la représentation d'un objet quelconque par une chaîne de caractères. On souhaite redéfinir cette méthode de sorte que, par exemple, la proposition (p et non q) ou r soit représentée par la chaîne ((p&(~q))|r), si p, q, et r sont des atomes représentant les faits "p", "q" et "r". L'expression textuelle obtenue doit être complètement parenthésée, comme sur cet exemple.

    Redéfinir la méthode toString dans chacune des classes Atome, Conj, Disj et Neg.

    Tester cette méthode en imprimant sur System.out la proposition non (a et non(b ou non non c)), définie dans la fonction main.

  3. La valeur de vérité d'une proposition peut être calculée dès que la valeur de vérité de chacun des atomes qu'elle contient est connue. On représente une valeur de vérité par une valeur de type boolean.

    Ajoutez un champ valeur au type Atome et modifier son constructeur en conséquence.

    Déclarer une méthode évaluer dans la classe Prop et l'implémenter dans chacune des autres classes afin de calculer la valeur de vérité d'une proposition quelconque.

    Tester cette méthode dans la fonction main, sur la même proposition, par exemple si a faux, b et c vrais.

  4. Ajouter à chacune de ces classes les méthodes prédicats (testant si une proposition est un atome, si elle est une conjonction, etc.).

  5. Une proposition est en forme normale négative (fnn) si la négation est appliqué seulement aux atomes. La fnn est obtenue en "rentrant" les négations à l'intérieur des conjonctions et des disjonctions par application des règles

      non(p et q) --> (non p) ou (non q) 
      non(p ou q) --> (non p) et (non q) 
      non(non p) --> p
    

    Déclarer une méthode fnn dans la classe Prop et l'implémenter dans chacune des autres classes afin de calculer la fnn d'une proposition quelconque.

    Tester cette méthode dans la fonction main, toujours sur la même proposition.


[Cours Java]

Mise à jour :