Sémantique d'un mini-langage |
Require Arith.
Require PolyList.
Require Peano_dec.
Require Zerob.
Require EqDecide.
Require IfProp.
Set Implicit Arguments.
Section Abstract.
Syntaxe des programmesUn programme est ensemble de clauses gardées formées d'une garde et d'une suite d'affectations de termes à des variables |
| Les variables, constantes et symboles de fonctions binaires sont des paramètres abstraits |
Variables var, cte, fun : Set.
| Définition inductive des termes |
Inductive term : Set :=
Var : var -> term
| Cte : cte -> term
| Fun : fun -> term -> term -> term.
| Une affectation multiple de termes à des variables, se représente comme une liste de couples formés d'une variable et d'un terme appelée une substitution |
Definition substitution := (list (var * term)).
| Une clause est formée d'une terme représentant la garde (vraie si elle ne s'évalue pas en 0) et d'une substitution |
Definition clause := term * substitution.
Definition programme := (list clause).
Sémantique des programmesLes programmes sont interprétés comme des transformations sur les valuations qui représentent l'état de la mémoire |
| Une valuation est une interprétation des variables par des entiers |
Definition valuation := var -> nat.
| On se donne une interprétation des constantes et symboles de fonctions |
Variable cte_sem : cte -> nat.
Variable fun_sem : fun -> nat -> nat -> nat.
| Chaque expression représente un entier |
Fixpoint term_sem [val:valuation;t:term] : nat
:= Cases t of
(Var v) => (val v)
| (Cte c) => (cte_sem c)
| (Fun f t1 t2) => (fun_sem f (term_sem val t1) (term_sem val t2))
end.
| Une substitution definit une transformation sur les valuations. La sémantique d'une substitution est définie par récurrence sur la longueur de la substitution. Pour la construire il faut supposer que l'égalité est décidable sur les variables |
Variable eq_var_dec : (v,v':var){v=v'}+{~v=v'}.
Cette propriété permet de definir des fonctions par cas sur l'égalité de deux variables : if (eq_var_dec v v') then [_]a else [_]b
|
Fixpoint aff_sem [val:valuation;aff:substitution] : valuation :=
Cases aff of nil => [v:var](val v)
| (cons (v',t) rest) =>
[v:var]if (eq_var_dec v v') then [_](term_sem val t)
else [_](aff_sem val rest v)
end.
| Sémantique des clauses |
Definition clause_sem : valuation -> clause -> valuation :=
[val,c]let(g,aff)=c in
if (zerob (term_sem val g)) then val else (aff_sem val aff).
| La sémantique d'un programme est non déterministe par rapport à la clause qui sera exécutée et doit être représentée par une relation sur les valuations |
| Transition associée à une clause : la garde doit être vraie |
Definition evolve : clause -> valuation -> valuation -> Prop
:= [c,val1,val2]
let (g,aff) = c in (~(term_sem val1 g)=O /\ (aff_sem val1 aff)=val2).
Definition trans_prog : programme -> valuation -> valuation -> Prop
:= [prog,val1,val2](EX c:clause | (In c prog) & (evolve c val1 val2)).
End Abstract.