MFC/p3/funcional_con_punteros.maude
2018-11-06 17:28:03 +01:00

497 lines
15 KiB
Text

------------------
--- FUN Syntax ---
------------------
fmod QID# is
including QID * (
op _+_ to _#+#_,op _-_ to _#-#_,op _*_ to _#*#_,op _/_ to _#/#_,
op _<_ to _#<#_,op _<=_ to _#<=#_,op _>_ to _#>#_,op _>=_ to _#>=#_
) .
endfm
fmod INT# is
including INT * (
op _+_ to _#+#_,op _-_ to _#-#_,op _*_ to _#*#_,op _/_ to _#/#_,
op _<_ to _#<#_,op _<=_ to _#<=#_,op _>_ to _#>#_,op _>=_ to _#>=#_
) .
endfm
fmod NAME is
including QID# .
sort Name .
subsort Qid < Name .
ops a b c d e f g h i j k l m n o p q r s t u v x y z w : -> Name .
endfm
fmod NAME-LIST is
including NAME .
sort NameList .
subsort Name < NameList .
op `(`) : -> NameList .
op _,_ : NameList NameList -> NameList [assoc id: ()] .
endfm
fmod GENERIC-EXP-SYNTAX is
including NAME .
including INT# .
sort Exp .
subsorts Int Name < Exp .
endfm
fmod EXP-LIST is
including GENERIC-EXP-SYNTAX .
including NAME-LIST .
sort ExpList .
subsorts Exp NameList < ExpList .
op _,_ : ExpList ExpList -> ExpList [ditto] .
endfm
fmod ARITHMETIC-EXP-SYNTAX is
including GENERIC-EXP-SYNTAX .
ops _+_ _-_ : Exp Exp -> Exp [prec 33 gather (E e)] .
ops _*_ _/_ _%_ : Exp Exp -> Exp [prec 31 gather (E e)] .
endfm
fmod BOOLEAN-EXP-SYNTAX is
including GENERIC-EXP-SYNTAX .
ops true false : -> Exp .
ops _==_ _<=_ _>=_ _and_ _or_ : Exp Exp -> Exp .
op not_ : Exp -> Exp .
endfm
fmod IF-SYNTAX is
including GENERIC-EXP-SYNTAX .
op if_then_else_ : Exp Exp Exp -> Exp .
endfm
fmod FUNCTION-SYNTAX is
including EXP-LIST .
op fun_->_ : NameList Exp -> Exp .
op __ : Exp ExpList -> Exp [prec 0] .
endfm
fmod BINDING-SYNTAX is
including GENERIC-EXP-SYNTAX .
including NAME-LIST .
sorts Binding Bindings .
subsort Binding < Bindings .
op _=_ : Exp Exp -> Binding .
op _and_ : Bindings Bindings -> Bindings [assoc prec 100] .
endfm
fmod LET-SYNTAX is
including BINDING-SYNTAX .
op let_in_ : Bindings Exp -> Exp .
endfm
fmod LETREC-SYNTAX is
including BINDING-SYNTAX .
op let`rec_in_ : Bindings Exp -> Exp .
endfm
fmod LIST-SYNTAX is
including EXP-LIST .
op [] : -> Exp .
op [_] : ExpList -> Exp .
ops car cdr null? : Exp -> Exp .
op cons : Exp Exp -> Exp .
endfm
fmod POINTER-SYNTAX is
including GENERIC-EXP-SYNTAX .
ops &_ *_ : Name -> Exp .
endfm
fmod ASSIGNMENT-SYNTAX is
including GENERIC-EXP-SYNTAX .
op _:=_ : Exp Exp -> Exp .
endfm
fmod SEQ-COMP-SYNTAX is
including GENERIC-EXP-SYNTAX .
op _;_ : Exp Exp -> Exp [assoc prec 50] .
endfm
fmod BLOCK-SYNTAX is
including SEQ-COMP-SYNTAX .
op {} : -> Exp .
op {_} : Exp -> Exp .
endfm
fmod LOOP-SYNTAX is
including GENERIC-EXP-SYNTAX .
op while__ : Exp Exp -> Exp .
op for(_;_;_)_ : Exp Exp Exp Exp -> Exp .
endfm
fmod FUN-SYNTAX is
including ARITHMETIC-EXP-SYNTAX .
including BOOLEAN-EXP-SYNTAX .
including IF-SYNTAX .
including FUNCTION-SYNTAX .
including LET-SYNTAX .
including LETREC-SYNTAX .
including LIST-SYNTAX .
including ASSIGNMENT-SYNTAX .
including SEQ-COMP-SYNTAX .
including BLOCK-SYNTAX .
including LOOP-SYNTAX .
including POINTER-SYNTAX .
endfm
---------------------
--- Fun Semantics ---
---------------------
fmod LOCATION is
including INT# .
sort Location .
op loc : Nat -> Location .
endfm
fmod LOCATION-LIST is
including LOCATION .
sort LocationList .
subsort Location < LocationList .
op nil : -> LocationList .
op _,_ : LocationList LocationList -> LocationList [assoc id: nil] .
op locs : Nat Nat -> LocationList .
vars N # : Nat .
eq locs(N, 0) = nil .
eq locs(N, #) = loc(N), locs(N #+# 1, # #-# 1) .
endfm
fmod ENVIRONMENT is
including NAME-LIST .
including LOCATION-LIST .
sort Env .
op empty : -> Env .
op [_,_] : Name Location -> Env .
op __ : Env Env -> Env [assoc comm id: empty] .
op _[_] : Env Name -> [Location] .
op _[_<-_] : Env NameList LocationList -> [Env] .
vars X X' : Name . vars Env : Env . vars L L' : Location .
var Xl : NameList . var Ll : LocationList .
eq ([X,L] Env)[X] = L .
eq ([X',L'] Env)[X <- L] = if X == X' then [X',L] Env else [X',L'] (Env[X <- L]) fi .
eq empty[X <- L] = [X,L] .
eq Env[X,Xl <- L,Ll] = Env[X <- L][Xl <- Ll] .
eq Env[() <- nil] = Env .
endfm
fmod VALUE is
sort Value .
op nothing : -> Value .
endfm
fmod VALUE-LIST is
including VALUE .
sort ValueList .
subsort Value < ValueList .
op nil : -> ValueList .
op _,_ : ValueList ValueList -> ValueList [assoc id: nil] .
endfm
fmod STORE is
including LOCATION-LIST .
including VALUE-LIST .
sort Store .
op empty : -> Store .
op [_,_] : Location Value -> Store .
op __ : Store Store -> Store [assoc comm id: empty] .
op _[_] : Store Location -> [Value] .
op _[_<-_] : Store LocationList ValueList -> [Store] .
vars L L' : Location . var Mem : Store . vars V V' : Value .
var Ll : LocationList . var Vl : ValueList .
eq ([L,V] Mem)[L] = V .
eq ([L',V'] Mem)[L <- V] = if L == L' then [L',V] Mem else [L',V'] (Mem[L <- V]) fi .
eq empty[L <- V] = [L,V] .
eq Mem[L,Ll <- V,Vl] = Mem[L <- V][Ll <- Vl] .
eq Mem[nil <- nil] = Mem .
endfm
fmod CONTINUATION is
sorts Continuation ContinuationItem .
op stop : -> Continuation .
op _->_ : ContinuationItem Continuation -> Continuation .
endfm
fmod FUN-STATE is
sorts PLStateAttribute PLState .
subsort PLStateAttribute < PLState .
including ENVIRONMENT .
including STORE .
including CONTINUATION .
op empty : -> PLState .
op __ : PLState PLState -> PLState [assoc comm id: empty] .
op nextLoc : Nat -> PLStateAttribute .
op mem : Store -> PLStateAttribute .
op k : Continuation -> PLStateAttribute .
op x : Continuation -> PLStateAttribute .
endfm
fmod FUN-HELPING-OPERATIONS is
including NAME-LIST .
including EXP-LIST .
including FUN-STATE .
var X : Name . vars E E' : Exp . var El : ExpList . var K : Continuation .
vars V : Value . var Vl : ValueList . var Xl : NameList .
var Env : Env . var Mem : Store . var N : Nat . var Ll : LocationList .
op exp : ExpList Env -> ContinuationItem .
op val_ : ValueList -> ContinuationItem .
eq k(exp((), Env) -> K) = k(val(nil) -> K) .
eq k(exp((E,E',El), Env) -> K) = k(exp(E, Env) -> exp((E',El), Env) -> K) .
eq k(val(V) -> exp(El, Env) -> K) = k(exp(El, Env) -> val(V) -> K) .
eq k(val(Vl) -> val(V) -> K) = k(val(V,Vl) -> K) .
op bindTo : NameList Env -> ContinuationItem .
op bindTo : NameList Env LocationList -> ContinuationItem .
eq bindTo(Xl,Env) = bindTo(Xl, Env, nil) .
eq k(val(V,Vl) -> bindTo((X,Xl), Env, Ll) -> K)
mem(Mem) nextLoc(N)
= k(val(Vl) -> bindTo(Xl, Env[X <- loc(N)], (Ll,loc(N))) -> K)
mem(Mem [loc(N),V]) nextLoc(N #+# 1) .
eq k(val(nil) -> bindTo((), Env, Ll) -> K) = k(pair(Env, Ll) -> K) .
eq k(bindTo((X,Xl), Env, Ll) -> K) nextLoc(N)
= k(bindTo(Xl, Env[X <- loc(N)], (Ll,loc(N))) -> K) nextLoc(N #+# 1) .
eq k(bindTo((), Env, Ll) -> K) = k(pair(Env,Ll) -> K) .
op writeTo_ : LocationList -> ContinuationItem .
eq k(val(Vl) -> writeTo(Ll) -> K) mem(Mem)
= k(K) mem(Mem[Ll <- Vl]) .
op pair : Env LocationList -> ContinuationItem .
ops exp exp* : ExpList -> ContinuationItem .
op writeTo : -> ContinuationItem .
eq pair(Env,Ll) -> exp(El) -> K = exp(El, Env) -> pair(Env, Ll) -> K .
eq pair(Env,Ll) -> writeTo -> K = writeTo(Ll) -> pair(Env,Ll) -> K .
eq pair(Env,Ll) -> exp*(E) -> K = exp(E, Env) -> K .
op discard : -> ContinuationItem .
eq k(val(Vl) -> discard -> K) = k(K) .
endfm
fmod GENERIC-EXP-SEMANTICS is
including FUN-HELPING-OPERATIONS .
op int : Int -> Value .
var I : Int . var X : Name . var L : Location . var V : Value .
var K : Continuation . var Env : Env . var Mem : Store .
eq k(exp(I, Env) -> K) = k(val(int(I)) -> K) .
eq k(exp(X, ([X,L] Env)) -> K) mem(Mem)
= k(val(Mem[L]) -> K) mem(Mem) .
endfm
fmod ARITHMETIC-EXP-SEMANTICS is
including ARITHMETIC-EXP-SYNTAX .
including GENERIC-EXP-SEMANTICS .
vars E E' : Exp . var K : Continuation . vars I I' : Int . var Env : Env .
ops + - * / % : -> ContinuationItem .
eq k(exp(E + E', Env) -> K) = k(exp((E,E'),Env) -> + -> K) .
eq k(val(int(I),int(I')) -> + -> K) = k(val(int(I #+# I')) -> K) .
eq k(exp(E - E', Env) -> K) = k(exp((E,E'), Env) -> - -> K) .
eq k(val(int(I),int(I')) -> - -> K) = k(val(int(I #-# I')) -> K) .
eq k(exp(E * E', Env) -> K) = k(exp((E,E'), Env) -> * -> K) .
eq k(val(int(I),int(I')) -> * -> K) = k(val(int(I #*# I')) -> K) .
eq k(exp(E / E', Env) -> K) = k(exp((E,E'), Env) -> / -> K) .
ceq k(val(int(I),int(I')) -> / -> K) = k(val(int(I quo I')) -> K)
if I' =/= 0 .
eq k(exp(E % E', Env) -> K) = k(exp((E,E'), Env) -> % -> K) .
ceq k(val(int(I),int(I')) -> % -> K) = k(val(int(I rem I')) -> K)
if I' =/= 0 .
endfm
fmod BOOLEAN-EXP-SEMANTICS is
including BOOLEAN-EXP-SYNTAX .
including GENERIC-EXP-SEMANTICS .
op bool : Bool -> Value .
ops == <= >= and or not : -> ContinuationItem .
vars E E' : Exp . var K : Continuation .
vars I I' : Int . vars B B' : Bool . var Env : Env .
eq k(exp(true, Env) -> K) = k(val(bool(true)) -> K) .
eq k(exp(false, Env) -> K) = k(val(bool(false)) -> K) .
eq k(exp(E == E', Env) -> K) = k(exp((E,E'), Env) -> == -> K) .
eq k(val(int(I),int(I')) -> == -> K) = k(val(bool(I == I')) -> K) .
eq k(exp(E <= E', Env) -> K) = k(exp((E,E'), Env) -> <= -> K) .
eq k(val(int(I),int(I')) -> <= -> K) = k(val(bool(I #<=# I')) -> K) .
eq k(exp(E >= E', Env) -> K) = k(exp((E,E'), Env) -> >= -> K) .
eq k(val(int(I),int(I')) -> >= -> K) = k(val(bool(I #>=# I')) -> K) .
eq k(exp(E and E', Env) -> K) = k(exp((E,E'), Env) -> and -> K) .
eq k(val(bool(B),bool(B')) -> and -> K) = k(val(bool(B and B')) -> K) .
eq k(exp(E or E', Env) -> K) = k(exp((E,E'), Env) -> or -> K) .
eq k(val(bool(B),bool(B')) -> or -> K) = k(val(bool(B or B')) -> K) .
eq k(exp(not E, Env) -> K) = k(exp(E, Env) -> not -> K) .
eq k(val(bool(B)) -> not -> K) = k(val(bool(not B)) -> K) .
endfm
fmod IF-SEMANTICS is
including IF-SYNTAX .
including BOOLEAN-EXP-SEMANTICS .
vars BE E E' : Exp . var K : Continuation .
var B : Bool . var Env : Env .
op if : Exp Exp Env -> ContinuationItem .
eq k(exp(if BE then E else E', Env) -> K)
= k(exp(BE,Env) -> if(E,E',Env) -> K) .
eq k(val(bool(B)) -> if(E,E',Env) -> K)
= k(exp(if B then E else E' fi, Env) -> K) .
endfm
fmod FUNCTION-SEMANTICS is
including GENERIC-EXP-SEMANTICS .
including FUNCTION-SYNTAX .
op closure : NameList Exp Env -> Value .
op apply : -> ContinuationItem .
var Xl : NameList . vars F Body : Exp . var K : Continuation .
var Env : Env . var El : ExpList . var Vl : ValueList .
eq k(exp(fun Xl -> Body, Env) -> K) = k(val(closure(Xl, Body, Env)) -> K) .
eq k(exp(F(El), Env) -> K) = k(exp((F,El), Env) -> apply -> K) .
eq k(val(closure(Xl, Body, Env),Vl) -> apply -> K)
= k(val(Vl) -> bindTo(Xl, Env) -> exp*(Body) -> K) .
endfm
fmod BINDING-SEMANTICS is
including BINDING-SYNTAX .
including FUNCTION-SEMANTICS .
op `(_,_`) : NameList ExpList -> Bindings .
var X : Name . vars Xl Xl' : NameList .
var E : Exp . vars El El' : ExpList .
eq (X(Xl) = E) = (X = fun Xl -> E) .
eq (X = E) = (X, E) .
eq (Xl, El) and (Xl', El') = ((Xl,Xl'), (El,El')) .
endfm
fmod LET-SEMANTICS is
including LET-SYNTAX .
including BINDING-SEMANTICS .
var Xl : NameList . var El : ExpList . var E : Exp .
var K : Continuation . var Env : Env .
eq k(exp(let (Xl,El) in E, Env) -> K)
= k(exp(El, Env) -> bindTo(Xl, Env) -> exp*(E) -> K) .
endfm
fmod LETREC-SEMANTICS is
including LETREC-SYNTAX .
including BINDING-SEMANTICS .
var Xl : NameList . var K : Continuation .
var El : ExpList . var E : Exp . var Env : Env .
eq k(exp(let rec (Xl,El) in E, Env) -> K)
= k(bindTo(Xl,Env) -> exp(El) -> writeTo -> exp*(E) -> K) .
endfm
fmod LIST-SEMANTICS is
including LIST-SYNTAX .
including BOOLEAN-EXP-SEMANTICS .
op [_] : ValueList -> Value .
ops mkList car cdr cons null? : -> ContinuationItem .
vars E E' : Exp . var El : ExpList . var Env : Env .
var K : Continuation . var V : Value . var Vl : ValueList .
eq k(exp([], Env) -> K) = k(val([nil]) -> K) .
eq k(exp([El], Env) -> K) = k(exp(El, Env) -> mkList -> K) .
eq k(val(Vl) -> mkList -> K) = k(val([Vl]) -> K) .
eq k(exp(car(E), Env) -> K) = k(exp(E, Env) -> car -> K) .
eq k(val([V,Vl]) -> car -> K) = k(val(V) -> K) .
eq k(exp(cdr(E), Env) -> K) = k(exp(E, Env) -> cdr -> K) .
eq k(val([V,Vl]) -> cdr -> K) = k(val([Vl]) -> K) .
eq k(exp(cons(E,E'), Env) -> K) = k(exp((E,E'), Env) -> cons -> K) .
eq k(val(V,[Vl]) -> cons -> K) = k(val([V,Vl]) -> K) .
eq k(exp(null?(E), Env) -> K) = k(exp(E, Env) -> null? -> K) .
eq k(val([Vl]) -> null? -> K) = k(val(bool(Vl == nil)) -> K) .
endfm
fmod ASSIGNMENT-SEMANTICS is
including ASSIGNMENT-SYNTAX .
including GENERIC-EXP-SEMANTICS .
var X : Name . var E : Exp . var K : Continuation .
var Env : Env . var L : Location .
eq k(exp(X := E, ([X,L] Env)) -> K)
= k(exp(E, ([X,L] Env)) -> writeTo(L) -> val(nothing) -> K) .
endfm
fmod SEQ-COMP-SEMANTICS is
including SEQ-COMP-SYNTAX .
including GENERIC-EXP-SEMANTICS .
vars E E' : Exp . var K : Continuation . var V : Value . var Env : Env .
eq k(exp(E ; E', Env) -> K)
= k(exp(E, Env) -> discard -> exp(E', Env) -> K) .
endfm
fmod BLOCK-SEMANTICS is
including BLOCK-SYNTAX .
including GENERIC-EXP-SEMANTICS .
var E : Exp . var K : Continuation . var Env : Env .
eq k(exp({}, Env) -> K) = k(val(nothing) -> K) .
eq k(exp({E}, Env) -> K) = k(exp(E, Env) -> K) .
endfm
fmod LOOP-SEMANTICS is
including LOOP-SYNTAX .
including IF-SEMANTICS .
including BLOCK-SEMANTICS .
including SEQ-COMP-SEMANTICS .
vars Start Cond Step Body : Exp . var K : Continuation . var Env : Env .
eq for(Start ; Cond ; Step) Body = Start ; while Cond {Body ; Step} .
eq k(exp(while Cond Body, Env) -> K)
= k(exp(Cond, Env) -> if(Body ; while Cond Body, {}, Env) -> K) .
endfm
fmod POINTER-SEMANTICS is
including POINTER-SYNTAX .
including ASSIGNMENT-SYNTAX .
including FUN-HELPING-OPERATIONS .
op pointer : Location -> Value .
var E : Exp .
var X : Name .
var V : Value .
var Env : Env .
var Mem : Store .
var L1 L2 : Location .
var K : Continuation .
eq k(exp(& X, Env) -> K) = k(val(pointer(Env[X])) -> K) .
eq k(exp(* X, ([X,L1] Env)) -> K) mem([L1,pointer(L2)] [L2,V] Mem)
= k(val(V) -> K) mem([L1,pointer(L2)] [L2,V] Mem) .
eq k(exp(* X := E, ([X,L1] Env)) -> K) mem([L1,pointer(L2)] Mem)
= k(exp(E, ([X,L1] Env)) -> writeTo(L2) -> val(nothing) -> K) mem([L1,pointer(L2)] Mem) .
endfm
fmod FUN-SEMANTICS is
including FUN-SYNTAX .
including ARITHMETIC-EXP-SEMANTICS .
including BOOLEAN-EXP-SEMANTICS .
including IF-SEMANTICS .
including FUNCTION-SEMANTICS .
including LET-SEMANTICS .
including LETREC-SEMANTICS .
including LIST-SEMANTICS .
including ASSIGNMENT-SEMANTICS .
including SEQ-COMP-SEMANTICS .
including BLOCK-SEMANTICS .
including LOOP-SEMANTICS .
including POINTER-SEMANTICS .
ops eval eval* : Exp -> [Value] .
op [_] : PLState -> [Value] .
op *[_]* : PLState -> [Value] .
var E : Exp . var V : Value . var S : PLState .
var N : Nat . var Mem : Store .
eq eval(E) = [k(exp(E, (empty).Env) -> stop) nextLoc(0) mem(empty)] .
eq [k(val(V) -> stop) S] = V .
eq eval*(E) = *[k(exp(E, (empty).Env) -> stop) nextLoc(0) mem(empty)]* .
eq *[k(val(V) -> stop) nextLoc(N) mem(Mem)]* = V .
endfm
--------------------
--- FUN Examples ---
--------------------
mod FUN-TEST is
including FUN-SEMANTICS .
endm