Définir un type expression booléenne avec Vrai, Faux, conjonction, disjonction, négation. Voici un exemple d'expression:
let e1 = Or(And(True,False),(Not False));; e1 : expression_booleenne = Or (And (True, False), Not False)
Écrire la fonction comparer qui teste si deux expressions booléennes sont identiques.
Écrire la fonction filtrer prenant un filtre et une expression et testant si l'expression satisfait ce filtre. Les filtres seront définis à l'aide d'un type décrivant les filtrages souhaités c'est-à-dire reconnaître Vrai, Faux, n'importe quoi (l'équivalent de _) ainsi que des négations, des conjonctions ou disjonctions booléennes. Par exemple:
filtrer F_nimporte_quoi e1;; - : bool = true filtrer (F_Or(F_nimporte_quoi, F_Not(F_nimporte_quoi))) e1;; - : bool = true
Écrire la fonction apparaitre qui teste si une sous-expression de expression satisfait le filtre.
Écrire la fonction compter_apparitions qui retourne le nombre de sous-expressions dans expression satisfaisant le filtre.
Redéfinir un nouveau type de filtre incorporant en plus la notion de variable de filtrage.
Écrire une nouvelle fonction filtrer prenant un filtre et une expression booléenne et retournant un couple (booléen, environnement). Le booléen indique si le filtrage a réussi tandis que l'environnement associe des variables de filtres aux valeurs qu'elles ont prises. Lorsqu'une variable de filtrage a déjà une valeur, elle n'admet que des expressions égales à cette valeur. Par exemple,
filtrer (F_Or(F_Parametre "x", F_Parametre "y")) e1 [];; - : bool * (string * expression_booleenne) list = true, ["y", Not False; "x", And (True, False)] filtrer (F_Or(F_Parametre "x", F_Parametre "x")) e1 [];; - : bool * (string * expression_booleenne) list = false, []
On admet maintenant la présence de variables au sein des expressions booléennes, définir ce nouveau type et écrire une fonction substituer prenant un nom de variable, une valeur qui est une expression booléenne et une expression et qui retourne une nouvelle expression d'où toutes les occurrences de (Variable nom) ont été remplacées par valeur. Par exemple,
substituer "x" (And(Variable "y", Not False)) (Or (Not (Variable "x"), And(Variable "x", Variable "y")));; - : expression_booleenne = Or (Not (And (Variable "y", Not False)), And (And (Variable "y", Not False), Variable "y"))
Ecrire une fonction unifier testant si deux expressions, comprenant des variables, s'unifient. Par exemple,
unifier True True [];; - : bool = true unifier (Or (And (Variable "x", Variable "y"), True)) (Or (And (False, True), Variable "z")) [];; - : bool = true