(* Title: Safe Heap Author: Ricardo Peņa and Javier de Dios Copyright: March 2008, Universidad Complutense de Madrid *) header {* Normal form values and heap *} theory SafeHeap imports Main begin types Location = nat Constructor = string FunName = string -- "Normal form values" datatype Val = Loc Location | IntT int | BoolT bool -- "Destructions of datatype val" consts the_IntT :: "Val => int" primrec "the_IntT (IntT i) = i" consts the_BoolT :: "Val => bool" primrec "the_BoolT (BoolT b) = b" -- "check if is constant bool" constdefs isBool :: "Val => bool" "isBool v ≡ (case v of (BoolT _ ) => True | _ => False )" text{* A heap is a partial mapping from locations to cells. But, as it is split into regions, the mapping tells also the region where the cell lives. The second component is the highest live region $k$. A consistent heap $(h,k)$ has cells only in regions $0\ldots k$. *} types Cell = "Constructor × Val list" Region = nat HeapMap = "Location \<rightharpoonup> (Region × Cell)" Heap = "HeapMap × nat" consts restrictToRegion :: "Heap => Region => Heap" (infix "\<down>" 110) primrec "(h,k) \<down> k0 = (let A = { p . p ∈ dom h & fst (the (h p)) <= k0} in (h |` A,k0))" constdefs fresh :: "Location => HeapMap => bool" "fresh p h ≡ p ∉ dom h" constdefs getFresh :: "HeapMap => Location" "getFresh h ≡ SOME b. fresh b h" text{* 'copy' is a runtime support function copying the recursive part of a data structure.*} consts copy :: "[Heap,Region,Location] => Heap × Location" constdefs self :: string -- "this identifies the topmost region referenced in a function body" "self ≡ ''self''" text{* The constructor table tells, for each constructor, the number of arguments and a description of each one. The second nat gives the alternative $0..n-1$ corresponding to this constructor in every {\bf case} of its type *} datatype ArgType = IntArg | BoolArg | NonRecursive | Recursive types ConstructorTableType = "(Constructor × (nat × nat × ArgType list)) list" ConstructorTableFun = "Constructor \<rightharpoonup> (nat × nat × ArgType list)" text{* This is the constructor table of the Safe expressions semantics. It is assumed to be a constant which somebody else will provide. It is used in the semantic function 'copy'*} consts ConstructorTable :: ConstructorTableFun (* Operations on cells *) constdefs getConstructorCell :: "Cell => Constructor" "getConstructorCell c ≡ fst c" constdefs getValuesCell :: "Cell => Val list" "getValuesCell c ≡ snd c" constdefs getCell :: "Heap => Location => Cell" "getCell h l ≡ snd (the ((fst h) l))" constdefs getRegion :: "Heap => Location => Region" "getRegion h l ≡ fst (the ((fst h) l))" constdefs domHeap :: "Heap => Location set" "domHeap h ≡ dom (fst h)" constdefs isNonBasicValue :: "ArgType => bool" "isNonBasicValue a == (a = NonRecursive) ∨ (a = Recursive)" constdefs isRecursive :: "ArgType => bool" "isRecursive a == (a = Recursive)" consts theLocation :: "Val => Location" primrec "theLocation (Loc l) = l" constdefs "getArgType C ≡ snd (snd (the (ConstructorTable C)))" constdefs getRecursiveValuesCell :: "Cell => Location set" "getRecursiveValuesCell c == set (map (theLocation o snd) (filter (isRecursive o fst) (zip (getArgType (getConstructorCell c)) (getValuesCell c))))" constdefs recDescendants :: "Location => Heap => Location set" "recDescendants l h ≡ case ((fst h) l) of Some c => getRecursiveValuesCell (snd c) | None => {}" constdefs getNonBasicValuesCell :: "Cell => Location set" "getNonBasicValuesCell c == set (map (theLocation o snd) (filter (isNonBasicValue o fst) (zip (getArgType (getConstructorCell c)) (getValuesCell c))))" constdefs descendants :: "Location => Heap => Location set" "descendants l h ≡ case ((fst h) l) of Some c => getNonBasicValuesCell (snd c) | None => {}" constdefs isConstant :: "Val => bool" "isConstant v ≡ (case v of (IntT _) => True | (BoolT _) => True | _ => False)" end