Semántica axiomática
de un lenguaje imperativo simple
J. L. Freire
Seminario 4.1, 3 de Mayo a las 18 h.
La conjunción y la implicación de dos predicados se escribirán P Ù Q y P Þ Q, si x es una variable y E una expresión, entonces P[x¬ E] representa el predicado que a cualquier memoria m le asocia P(m[x¬ v]) donde v es el valor tal que m |- E |> v. Si w es un valor, entonces E=w representa el predicado que a todo m le asocia la propiedad v=w donde v es el valor tal que m |- E |> v.
La definición de esta relación está dada por las reglas de inferencia de la figura 1
|
||||||||||
|
||||||||||
|
||||||||||
|
Coq < Definition Assertion := memory->Prop.
Coq < Definition Istrue : bexpr->Assertion
:= [E:bexpr][m:memory](bexprval m E true).
Coq < Definition Isfalse : bexpr->Assertion
:= [E:bexpr][m:memory](bexprval m E false).
Coq < Inductive AndAss [P,Q:Assertion;m:memory] : Prop := Conjass : (P m)->(Q m)->(AndAss P Q m).
Hint Conjass.
Coq < Definition ImplAss : Assertion->Assertion->Prop
:= [P,Q:Assertion](m:memory)(P m)->(Q
m).
El transformador siguiente corresponde a lo que sa ha denotado P[X¬ E]. El término (memupdate x E P) representa el predicado que en un estado m vale P(m[X¬ v]), siendo v el valor de la expresión E en la memoria m.
Coq < Definition memupdate : name->expr->Assertion->Assertion
:=
[x:name][e:expr][P:Assertion][m:memory]
(v:semval)(exprval m e v)->(P (update x v m)).
es decir, (P[x¬ e]) m := P(m([x¬ v])) si m |- e |> v.
Coq < Inductive trueform : Assertion->com->Assertion->Prop
:= trueskip: (P:Assertion)(trueform P skip
P)
| trueaff : (P:Assertion)(n:name)(e:expr)
(trueform
(memupdate n e P) (aff n e) P)
| trueseq : (P,Q,R:Assertion)(c,d:com)
(trueform P c R)->(trueform R d Q)
->(trueform P (seq c d) Q)
| truecond: (P,Q:Assertion)(e:expr)(c,d:com)
(trueform (AndAss P (Istrue e)) c Q)
->(trueform (AndAss P (Isfalse e)) d Q)
->(trueform P (cond e c d) Q)
| truewhile: (P:Assertion)(e:expr)(c:com)
(trueform (AndAss P (Istrue e))
c P)
->(trueform P (while
e c) (AndAss P (Isfalse e)))
| truecons : (P,P1,Q,Q1:Assertion)(c:com)
(ImplAss
P P1)->(trueform P1 c Q1)->(ImplAss Q1 Q)
->(trueform P c Q).
Coq < Theorem truecorrect:
(P,Q:Assertion)(c:com)
(trueform P c Q)->(m1,m2:memory)
(semcom m1 c m2)->(P m1)->(Q m2).
La demostración, requiere algunas construcciones intermedias.
Definition ifProp : bool -> Prop -> Prop -> Prop
:= [b,A,B]if b then A else B.
Local semcom_prop := [m,m':memory][c:com]
Cases c of
skip
=> m=m'
| (aff n e) => (EX
v:nat | (aexprval m e v) & (update n v m)=m')
| (seq c1 c2) =>
(EX m1:memory
| (semcom m c1 m1) & (semcom m1 c2 m'))
| (cond e c1 c2)=>
(EX b:bool
| (bexprval m e b) &
(ifProp b (semcom m c1 m') (semcom m c2 m')))
| (while e c1) =>
(EX b:bool
| (bexprval m e b) &
(ifProp b (EX
m1:memory |(semcom m c1 m1)&
(semcom m1 (while e c1) m'))
m=m'))
end.
Lemma semcom_inv :
(m1,m2:memory)(c:com)(semcom
m1 c m2)->(semcom_prop m1 m2 c).
Goal.
Induction 1; Simpl.
Trivial.
Intros; Exists v; Auto.
Intros; Exists m3; Auto.
Intros; Exists true; Trivial.
Intros; Exists false; Trivial.
Intros; Exists true; Simpl; Auto.
Exists m4; Auto.
Intros; Exists false; Simpl; Auto.
Save.
Goal.
Induction 1; Intros.
Elim (semcom_inv m1 m2 skip); Auto.
Elim (semcom_inv m1 m2 (aff n e)); Trivial.
Destruct 2; Apply H1; Trivial.
Elim (semcom_inv m1 m2 (seq c0 d)); Trivial.
Intros; Apply (H3 x m2); Trivial.
Apply (H1 m1 x); Auto.
Elim (semcom_inv m1 m2 (cond e c0 d)); Trivial.
Destruct x; Simpl; Intros.
Apply (H1 m1); Auto.
Apply (H3 m1); Auto.
Local AndAsswhile :=
[c:com][m,m':memory][P0:Assertion]
Cases c of
skip
=> True
| (aff n e)
=> True
| (seq c1 c2) => True
| (cond e c1 c2) => True
| (while e c1) => ((m1,m2:memory)
(semcom
m1 c1 m2)->(AndAss P0 (Istrue e) m1)->(P0 m2))
->(P0 m)->(AndAss P0 (Isfalse e) m')
end.
Generalize H1 H3.
Change (AndAsswhile (while e c0) m1 m2 P0).
Elim H2; Simpl; Auto.
Intros.
Apply H8; Trivial.
Apply (H9 m0); Auto.
Apply (H3 m2); Apply (H2 m1); Trivial.
Apply (H0 m1); Trivial.
Save.