next up previous contents
Next: Hoare logic Up: Imperative programs Previous: Updating

An imperative programming language

 

Assignments are the only statements in an imperative programming language responsible for changes on states. Consider any assignment x:=t. It expects two arguments, a variable x of some type  tex2html_wrap_inline377 and an expression t which when evaluated in some environment yields an expression of type  tex2html_wrap_inline377 . The expression t may of course refer to some variable, but when we write something like x:=x+1, we mean to evaluate the variable x in the current environment and update x in this environment. Notice that the environment is an implicit parameter to characterise the term in assignments, which cannot be avoided if we mix pure expressions with variables of the imperative programming language.

For an adequate encoding, we perform a functional abstraction and require the type of the second argument to explicitly mention the current environment i.e.,

assign:{sort|location->Type}
       {x:location}((Env sort)->sort x)->prog|sort.

Boolean expressions in conditionals and loops may be represented similarly, yielding a many-sorted imperative programming language as an inductive type,

 ** Module lib_ipl Imports lib_locations
 $prog : (location->Type)->Type(prog)
 $skip : {sort|location->Type}prog|sort
 $assign :
    {sort|location->Type}{x:location}((Env sort)->sort x)->prog|sort
 $seq : {sort|location->Type}(prog|sort)->(prog|sort)->prog|sort
 $ifthenelse :
    {sort|location->Type}((Env sort)->bool)->(prog|sort)->(prog|sort)->
    prog|sort
 $while :
    {sort|location->Type}((Env sort)->bool)->(prog|sort)->prog|sort
 $prog_elim :
    {sort|location->Type}{C_prog:(prog|sort)->TYPE}
    (C_prog (skip|sort))->
    ({x:location}{x8:(Env sort)->sort x}C_prog (assign x x8))->
    ({x6,x7:prog|sort}(C_prog x6)->(C_prog x7)->C_prog (seq x6 x7))->
    ({x3:(Env sort)->bool}{x4,x5:prog|sort}(C_prog x4)->(C_prog x5)->
     C_prog (ifthenelse x3 x4 x5))->
    ({x1:(Env sort)->bool}{x2:prog|sort}(C_prog x2)->
     C_prog (while x1 x2))->{z:prog|sort}C_prog z
[[sort|location->Type][C_prog:(prog|sort)->TYPE]
 [f_skip:C_prog (skip|sort)]
 [f_assign:{x:location}{x8:(Env sort)->sort x}C_prog (assign x x8)]
 [f_seq:{x6,x7:prog|sort}(C_prog x6)->(C_prog x7)->C_prog (seq x6 x7)]
 [f_ifthenelse:{x3:(Env sort)->bool}{x4,x5:prog|sort}(C_prog x4)->
  (C_prog x5)->C_prog (ifthenelse x3 x4 x5)]
 [f_while:{x1:(Env sort)->bool}{x2:prog|sort}(C_prog x2)->
  C_prog (while x1 x2)][x:location][x8:(Env sort)->sort x]
 [x6,x7:prog|sort][x3:(Env sort)->bool][x4,x5:prog|sort]
 [x1:(Env sort)->bool][x2:prog|sort]
    prog_elim C_prog f_skip f_assign f_seq f_ifthenelse f_while
              (skip|sort)  ==>  f_skip
 || prog_elim C_prog f_skip f_assign f_seq f_ifthenelse f_while
              (assign x x8)  ==>  f_assign x x8
 || prog_elim C_prog f_skip f_assign f_seq f_ifthenelse f_while
              (seq x6 x7)  ==>
    f_seq x6 x7
          (prog_elim C_prog f_skip f_assign f_seq f_ifthenelse f_while
                     x6)
          (prog_elim C_prog f_skip f_assign f_seq f_ifthenelse f_while
                     x7)
 || prog_elim C_prog f_skip f_assign f_seq f_ifthenelse f_while
              (ifthenelse x3 x4 x5)  ==>
    f_ifthenelse x3 x4 x5
                 (prog_elim C_prog f_skip f_assign f_seq f_ifthenelse
                            f_while x4)
                 (prog_elim C_prog f_skip f_assign f_seq f_ifthenelse
                            f_while x5)
 || prog_elim C_prog f_skip f_assign f_seq f_ifthenelse f_while
              (while x1 x2)  ==>
    f_while x1 x2
            (prog_elim C_prog f_skip f_assign f_seq f_ifthenelse f_while
                       x2)]

  ifthen = ... :
    {sort|location->Type}((Env sort)->bool)->(prog|sort)->prog|sort
  limplies = ... :
    {sort|location->Type}((Env sort)->Prop)->((Env sort)->Prop)->Prop
  Assertion_or = ... :
    {sort|location->Type}((Env sort)->Prop)->((Env sort)->Prop)->
    (Env sort)->Prop
* limplies_refl = ... :
    {sort|location->Type}{P:(Env sort)->Prop}limplies P P
* limplies_trans = ... :
    {sort|location->Type}{P,Q,R:(Env sort)->Prop}(limplies P Q)->
    (limplies Q R)->limplies P R



Lego
Fri May 24 19:01:27 BST 1996