Plan 9 from Bell Labs’s /usr/web/sources/contrib/fernan/nhc98/tests/nofib/real/veritas/Kernel.hs
{- * kernel for vts90 * * Tue Nov 6 14:35:39 GMT 1990 * * For information about the typing rules for the construction of * term, signatures, declarations an signatures see the file * doc/abstract_logic/rules3.tex * -} module Kernel where import Core_database import Dcore import Sub_Core1 import Sub_Core2 import Sub_Core3 import Sub_Core4 import Vtslib import Core_datatype {- for tags -- terms and theorems now defined in core_datatype -} --data Trm = TM ITrm ITrm ISgn | {- the term, its type, and signature -} -- TM_Err String data Sgn = SG ISgn | SG_Err String data Dec = DC IDec ISgn | {- the declaration, and its signature -} DC_Err String --data Thm = TH ITrm ISgn | {- the theorem, and its signature -} -- TH_Err String {- (*and Mph = MP of mapping list*) -} {- Symbol formation -} symbol (SG sg) i j = if share_map !! i == i then TM (Sym i j [] []) (typ_of_sm sg i j) sg else TM_Err "Malformed symbol" where share_map = get_share_map sg {- Universe formation -} universe (SG sg) i | i>=0 = TM (Constant (Univ i) [] []) (Constant (Univ (i+1)) [] []) sg | i<0 = TM_Err "Malformed Universe" {- Pi formation -} pi' (TM tm (Constant (Univ i) _ _) (Extend dc sg _)) = case typ_of_trm sg (typ_of_dec dc) of Constant (Univ j) _ _ -> TM tm1 tm2 sg where tm1 = Binder Pi dc tm [] [] tm2 = Constant (Univ (max i j)) [] [] _ -> TM_Err "Malformed pi expression" pi' _ = TM_Err "Sort of pi exression is not a universe" {- Pi introduction -} lambda (TM tm1 tm2 (Extend dc sg _)) = if is_sym_dec dc then TM (Binder Lambda dc tm1 [] []) (Binder Pi dc tm2 [] []) sg else TM_Err "lambda: invalid declaration" lambda (TM_Err mesg ) = TM_Err mesg lambda _ = TM_Err "Malformed lambda expression" {- PI elimination -} appl (TM tm1 (Binder Pi dc tm2 _ _) sg1) (TM tm3 tm4 sg2) = if eq_sgn sg1 sg2 && eq_trm (typ_of_dec dc) tm4 then TM (App tm1 tm3 [] []) (subst_trm dc tm2 tm3) sg1 else TM_Err "Malformed application" appl _ _ = TM_Err "Malformed application (2)" {- Sigma formation -} sigma (TM tm (Constant (Univ i) _ _) (Extend dc sg _)) = case typ_of_trm sg (typ_of_dec dc) of Constant (Univ j) _ _ -> TM tm1 tm2 sg where tm1 = Binder Sigma dc tm [] [] tm2 = Constant (Univ (max i j)) [] [] _ -> TM_Err "Malformed sigma" sigma _ = TM_Err "Malformed sigma (2)" {- Sigma introduction -} pair (TM tm1 tm2 sg1) (TM tm3 tm4 sg2) (TM tm7@(Binder Sigma dc tm5 _ _) tm6 sg3) = if eq_sgn sg1 sg2 && eq_sgn sg2 sg3 && eq_trm tm2 (typ_of_dec dc) && eq_trm tm4 (subst_trm dc tm5 tm1) then TM (Pair tm1 tm3 tm7 [] []) tm7 sg1 else TM_Err "Malformed pair" pair _ _ _ = TM_Err "Malformed pair (2)" {- Subtype formation -} subtype (TM tm (Constant Bool' _ _) (Extend dc sg _)) = if eq_trm (typ_of_trm sg (typ_of_dec dc)) (Constant (Univ 0) [] []) then TM (Binder Subtype dc tm [] []) (Constant (Univ 0) [] []) sg else TM_Err "Malformed subtype" subtype _ = TM_Err "Malformed subtype (2)" {- Subtype introduction -} into (TM tm1 tm2 sg1) (TM tm3@(Binder Subtype dc tm4 _ _) _ sg2) (TH tm5 sg3) = if eq_sgn sg1 sg2 && eq_sgn sg2 sg3 && eq_trm (typ_of_trm sg2 (typ_of_dec dc)) (Constant (Univ 0) [] []) && eq_trm tm2 (typ_of_dec dc) && eq_trm tm5 (subst_trm dc tm4 tm1) then TM (add_type tm1 tm3) tm3 sg1 else TM_Err "Malformed subtype introduction " into _ _ _ = TM_Err "Malformed subtype introduction (2)" {- Subtype elimination -} outof (TM tm1 (Binder Subtype dc _ _ _) sg) = TM (add_type tm1 tm2) tm2 sg where tm2 = typ_of_dec dc outof _ = TM_Err " outof: argument invalid" {- Bool formation -} bool_sm (SG sg) = TM (Constant Bool' [] []) (Constant (Univ 0) [] []) sg {- Bool introduction -} {- true formation -} true_sm (SG sg) = TM (Constant T [] []) (Constant Bool' [] []) sg {- false formation -} false_sm (SG sg) = TM (Constant F [] []) (Constant Bool' [] []) sg {- Universal quantification formation -} universal (TM tm (Constant Bool' _ _) (Extend dc sg _)) = if is_sym_dec dc then TM (Binder Forall dc tm [] []) (Constant Bool' [] []) sg else TM_Err "Malformed universal quantification" universal _ = TM_Err "Malformed universal quantification (2)" {- Existential quantification formation -} existential (TM tm (Constant Bool' _ _) (Extend dc sg _)) = if is_sym_dec dc then TM (Binder Exists dc tm [] []) (Constant Bool' [] []) sg else TM_Err "Malformed existential quantification" existential _ = TM_Err "Malformed existential quantification (2)" {- Implication formation -} implication (TM tm (Constant Bool' _ _) (Extend dc sg _)) = if is_axm_dec dc then TM (Binder Imp dc tm [] []) (Constant Bool' [] []) sg else TM_Err "Malformed Implication" implication _ = TM_Err "Malformed Implication (2)" {- And formation -} conjunction (TM tm1 (Constant Bool' _ _) sg1) (TM tm2 (Constant Bool' _ _) sg2) = if eq_sgn sg1 sg2 then TM (Binary' And tm1 tm2 [] []) (Constant Bool' [] []) sg1 else TM_Err "Malformed conjunction" conjunction _ _ = TM_Err "Malformed conjunction (2)" {- Or formation -} disjunction (TM tm1 (Constant Bool' _ _) sg1) (TM tm2 (Constant Bool' _ _) sg2) = if eq_sgn sg1 sg2 then TM (Binary' Or tm1 tm2 [] []) (Constant Bool' [] []) sg1 else TM_Err "Malformed disjunction " disjunction _ _ = TM_Err "Malformed disjunction (2)" {- Not formation -} negation (TM tm (Constant Bool' _ _) sg) = TM (Unary Not tm [] []) (Constant Bool' [] []) sg negation _ = TM_Err "Malformed negation" {- Eq formation -} equal (TM tm1 _ sg1) (TM tm2 _ sg2) = if eq_sgn sg1 sg2 then TM (Binary' Eq' tm1 tm2 [] []) (Constant Bool' [] []) sg1 else TM_Err "Malformed equality" {- Issustype formation -} issubtype (TM tm1 (Constant (Univ 0) _ _) sg1) (TM tm2 (Constant (Univ 0) _ _) sg2) = if eq_sgn sg1 sg2 then TM (Binary' Issubtype tm1 tm2 [] []) (Constant Bool' [] []) sg1 else TM_Err "Malformed subtype" issubtype _ _ = TM_Err "Malformed subtype (2)" {- Bool elimination (ie Conditionals) -} conditional (TM tm1 tm2 (Extend dc1 sg1 _)) (TM tm3 tm4 (Extend dc2 sg2 _)) = if eq_sgn sg1 sg2 && eq_trm tm2 tm4 && eq_trm (Unary Not (typ_of_dec dc1) [] []) (typ_of_dec dc2) then TM (Cond dc1 tm1 tm3 [] []) tm2 sg1 else TM_Err "Malformed conditional" conditional _ _ = TM_Err "Malformed conditional (2)" {- Hilbert epsilon operator introduction -} choose (TH (Binder Exists dc tm _ _) sg) = if eq_trm (typ_of_trm sg (typ_of_dec dc)) (Constant (Univ 0) [] []) then TM (Binder Choose dc tm [] []) (Binder Subtype dc tm [] []) sg else TM_Err "epsilon operator error" choose _ = TM_Err "epsilon operator error (2)" {- Datatype constructor formation and introduction -} constructor (SG sg) i j k = if share_map !! i == i then TM (Const i j k [] []) (typ_of_cn sg i j k) sg else TM_Err "Malformed constructor" where share_map = get_share_map sg {- Datatype elimination -} recurse tmL (TM (tm @ (Binder Pi (Symbol_dec tm1 _) _ _ _)) _ sg) = if forall ok (zip tmL tyL) then TM (Recurse (map fst tmL) tm [] []) tm sg else TM_Err "recurse error" where (tyL,_) = clause_types sg tm1 tm ok (TM _ tm1 sg1 , tm2) = eq_sgn sg sg1 && eq_trm tm1 tm2 fst (TM tm _ _) = tm recurse _ _ = TM_Err "recurse error (2)" {- Widen type -} widen (TM tm1 tm2 sg1) (TH (Binary' Issubtype tm3 tm4 _ _) sg2) = if eq_sgn sg1 sg2 && eq_trm tm2 tm3 then TM (add_type tm1 tm4) tm4 sg1 else TM_Err "widen: error" widen _ _ = TM_Err "widen: error (2)" {- Set the attributes of a term -} set_Trm_att (TM tm1 tm2 sg) iL att = TM (set_trm_att tm1 iL att) tm2 sg set_Trm_att (TM_Err mesg) _ _ = TM_Err mesg {- Get the attributes of a term -} get_Trm_att (TM tm _ _) iL = get_trm_att tm iL {- return the internal representation of a term -} internal_Trm (TM tm1 tm2 sg) = (tm1,tm2,sg) {- Read a term in from the database -} restore_Trm s = TM_Err "restore_Trm unimplemented" {- The empty signature -} empty = SG (Empty []) {- Extend a signature with a declaration -} extend (DC dc sg1) (SG sg2) = if eq_sgn sg1 sg2 then SG (Extend dc sg2 []) else SG_Err "Malformed signature extension" extend _ _ = SG_Err "Invalid declaration in signature" {- Combine two signatures -} combine (SG sg1) (SG sg2) = SG (Combine sg1 sg2 (len_sgn sg2) (sm2 ++ map update sm1) []) where sm1 = get_share_map sg1 sm2 = get_share_map sg2 offset = length sm2 update i = i + offset {- Share two sub-sigantures within a signature -} share (SG sg) i j = if eq_sgn sg1 sg2 then SG (Share sg i j (len_sgn sg2) (addequivL i j (len_sgn sg2) sm) []) else SG_Err "sg: Share" where sg1 = nth_sgn i sg sg2 = nth_sgn j sg sm = get_share_map sg {- Return the attributes of a signature -} get_Sgn_att (SG sg) = get_sgn_att sg {- Set the attributes of a signature -} set_Sgn_att (SG sg) att = (SG (set_sgn_att sg att)) {- Return the internal representation of a signature -} internal_Sgn (SG sg) = sg {- Restore a signature from the database -} restore_Sgn s = SG_Err "restore_Sgn unimplemented" {- declare a new symbol -} symbol_dec (TM tm1 tm2 sg) = case typ_of_trm sg tm2 of Constant (Univ _) _ _ -> DC (Symbol_dec tm1 []) sg _ -> DC_Err "Malformed symbol declaration" {- declare a new axiom -} axiom_dec (TM tm (Constant Bool' _ _) sg) = DC (Axiom_dec tm []) sg axiom_dec _ = DC_Err "Malformed axiom declaration" {- Define a new symbol -} def (TM tm1 tm2 sg) = DC (Def tm1 tm2 []) sg make_data tmLL (TH tm sg) = if forall (forall (wf_param sg1)) tmLL then if exists (eq_trm tm) non_empty_thms then DC (Data [] (map (map fst) tmLL) []) sg else DC_Err "Malformed datatype" else DC_Err "Malformed datatype (2)" where non_empty_thms = map gen_proof (filter is_base tmLL) wf_param sg1 (TM tm1 (Constant (Univ _) _ _) sg2) = eq_trm tm1 (Sym 0 0 [] []) || not (occurs 0 tm1) wf_param _ _ = False mk_exists tm1 tm2 = Binder Exists (Symbol_dec tm3 []) tm4 [] [] where tm3 = shift_trm [] (-1) tm1 tm4 = shift_trm [] 1 tm2 fst (TM tm _ _) = tm is_base tmL = not (exists (eq_trm (Sym 0 0 [] [])) (map fst tmL)) gen_proof tmL = foldr mk_exists (Constant T [] []) ( reverse (map fst tmL)) sg1 = Extend (Symbol_dec (Constant (Univ 0) [] []) []) sg [] polydata (DC (Data dcL tmLL _) (Extend dc sg _)) = if is_sym_dec dc then DC (Data (dc:dcL) tmLL []) sg else DC_Err "Malformed datatype (polydata)" polydata _ = DC_Err "Malformed datatype (polydata 2)" {- Declaration pair formation -} decpair (DC dc1 (Extend dc2 sg _)) = DC (Decpair dc2 dc1 []) sg decpair _ = DC_Err "Malformed declaation pair" {- Get the attributes of a declaration -} get_Dec_att (DC dc _) = get_dec_att dc {- Set the attributes of a declaration -} set_Dec_att (DC dc sg) att = DC (set_dec_att dc att) sg {- Return the internal representation of a declaration -} internal_Dec (DC dc sg) = (dc,sg) {- Restore a declaration from the database -} restore_Dec s = error "BadDeclaration" -- ** exn NOT IMPLEMENTED YET {- Axiom formation -} axiom (SG sg) i j = if share_map !! i == i then TH (typ_of_axm sg i j) sg else TH_Err "Malformed Axiom" where share_map = get_share_map sg {- Forall introduction -} generalise (TH tm (Extend dc sg _)) = if is_sym_dec dc then TH (Binder Forall dc tm [] []) sg else TH_Err "Malformed generalisation" generalise _ = TH_Err "Malformed generalisation (2)" {- Forall elimination -} specialise (TH (Binder Forall dc tm1 _ _) sg1) (TM tm2 tm3 sg2) = if eq_sgn sg1 sg2 && eq_trm (typ_of_dec dc) tm3 then TH (subst_trm dc tm1 tm2) sg1 else TH_Err "Malformed specialisation" specialise _ _ = TH_Err "Malformed specialisation (2)" {- Exists introduction -} exists_intro (TH tm1 sg1) (TM tm5@(Binder Exists dc tm2 _ _) _ sg2) (TM tm3 tm4 sg3) = if eq_sgn sg1 sg2 && eq_sgn sg2 sg3 && eq_trm (typ_of_dec dc) tm4 && eq_trm (subst_trm dc tm2 tm3) tm1 then TH tm5 sg2 else TH_Err "Malformed existential introduction" exists_intro _ _ _ = TH_Err "Malformed existential introduction (2)" {- Exists elimination -} exists_elim (TH (Binder Forall dc1 (Binder Imp dc tm2 _ _) _ _) sg1) (TH (Binder Exists dc2 tm3 _ _) sg2) = if eq_sgn sg1 sg2 && eq_dec dc1 dc2 && eq_trm ( typ_of_dec dc ) tm3 && not (occurs 0 tm2) then TH tm2 sg1 else TH_Err "Invalid existential elimination" exists_elim _ _ = TH_Err "Invalid existential elimination" {- => introduction -} discharge (TH tm (Extend dc sg _)) = if is_axm_dec dc then TH (Binder Imp dc tm [] [] ) sg else TH_Err "Invalid implication introduction" discharge _ = TH_Err "Invalid implication introduction (2)" {- => elimination -} modus_ponens (TH (Binder Imp dc tm2 _ _) sg1) (TH tm3 sg2) = if eq_sgn sg1 sg2 && eq_trm ( typ_of_dec dc ) tm3 then TH tm2 sg1 else TH_Err "Invalid implication elimination" modus_ponens _ _ = TH_Err "Invalid implication elimination" {- Propositional tautologies -} taut (TM tm (Constant Bool' _ _) sg) = if eval tm then TH tm sg else TH_Err "term is not a tautology" taut _ = TH_Err "argument must be a term of sort `bool'" {- Reflexivity of equality -} reflex (TM tm _ sg) = TH (Binary' Eq' tm tm [] []) sg {- Symmetry of equality -} symmetry (TH (Binary' Eq' tm1 tm2 _ _) sg) = TH (Binary' Eq' tm2 tm1 [] []) sg symmetry _ = TH_Err "symmetry: argument must be an equality term" {- Beta reduce a subterm of a theorem -} beta_rw (TH tm sg) i = case select_trm tm i of (App (Binder Lambda dc tm1 _ _) tm2 _ _ ,_) -> TH (replace_trm tm (subst_trm dc tm1 tm2) i) sg _ -> TH_Err "Invalid beta reduction" {- Eta reduce a subterm of a theorem -} eta_rw (TH tm sg) i = case select_trm tm i of (Binder Lambda dc (App tm1 tm2 _ _) _ _ ,_) -> if not (occurs 0 tm1) && eta_match dc tm2 1 then TH (replace_trm tm (shift_trm [] (-1) tm1) i) sg else TH_Err "Invalid eta reduction" _ -> TH_Err "Invlaid eta reduction (2)" {- Rewrite conditional (condition is true) -} cond_true_rw (TH tm1 sg1) (TH tm2 sg2) i = case select_trm tm2 i of (Cond dc tm3 tm4 _ _ ,dcL) -> if eq_sgn sg1 sg3 && eq_trm tm1 (typ_of_dec dc) then TH (replace_trm tm2 (shift_trm [] (-1) tm3) i) sg1 else TH_Err "cond_true_rw: error" where sg3 = foldr (\ dc -> \ sg -> Extend dc sg []) sg2 dcL _ -> TH_Err "cond_true_rw: error 2" {- Rewrite conditional (condition is false) -} cond_false_rw (TH tm1 sg1) (TH tm2 sg2) i = case select_trm tm2 i of (Cond dc tm3 tm4 _ _ ,dcL) -> if eq_sgn sg1 sg3 && eq_trm tm1 (Unary Not (typ_of_dec dc) [] []) then TH (replace_trm tm2 (shift_trm [] (-1) tm4) i) sg1 else TH_Err "cond_false_rw: error" where sg3 = foldr (\ dc -> \ sg -> Extend dc sg []) sg2 dcL _ -> TH_Err "cond_false_rw: error 2" {- Substutution of equal terms -} subterm_rw (TH tm1 sg1) (TH (Binary' Eq' tm2 tm3 _ _) sg2) i = if eq_sgn sg3 sg3 && eq_trm tm2 tm4 then TH (replace_trm tm1 tm3 i) sg1 else TH_Err "subterm_rw: terms or sigs unequal" where (tm4,dcL) = select_trm tm1 i sg3 = foldr (\ dc -> \ sg -> Extend dc sg []) sg1 dcL subterm_rw _ _ _ = TH_Err "subterm_rw: Invalid argument" {- Injectivity of datatypes -} injection (TH (Binary' Eq' tm1 tm2 _ _) sg) = case (reduce_app tm1 [], reduce_app tm2 []) of (c1@(Const i j k _ _):tmL1 , c2@(Const _ _ _ _ _):tmL2) -> case extract_dc j (nth_dec i sg) of Data dcL _ _ -> if length dcL < length tmL1 && eq_trm c1 c2 && length tmL1 == length tmL2 then TH (foldr1 mk_and (map mk_eq (zip tmL11 tmL21))) sg else TH_Err "Invalid injection" where tmL11 = drop (length dcL) tmL1 tmL21 = drop (length dcL) tmL2 _ -> TH_Err "Invalid injection: not a datatype" _ -> TH_Err "Invalid injection (3)" where reduce_app (App tm1 tm2 _ _) tmL = reduce_app tm1 (tm2:tmL) reduce_app tm tmL = tm:tmL mk_eq (tm1,tm2) = Binary' Eq' tm1 tm2 [] [] mk_and tm1 tm2 = Binary' And tm1 tm2 [] [] injection _ = TH_Err "Invalid injection (4)" {- Induction over datatypes -} induction (TM tm@(Const i j 0 _ _) _ sg) = TH ind_axm sg where ind_axm = induction_trm sg tm induction _ = TH_Err "Invalid induction" {- Issubtype introduction -} issubstype_intro (TH (Binder Forall dc1 tm1 _ _) sg) = case tm1 of Binder Exists dc2 (Binary' Eq' tm2 tm3 _ _) _ _ -> case (tm2,tm3) of (Sym 1 0 _ _ , Sym 0 0 _ _) -> TH (Binary' Issubtype tm4 tm5 [] []) sg where tm4 = typ_of_dec dc1 tm5 = shift_trm [] (-1) (typ_of_dec dc2) _ -> TH_Err "issubtype_intro error (1)" _ -> TH_Err "issubtype_intro error (2)" issubstype_intro _ = TH_Err "issubtype_intro error (3)" {- Issubtype elimination -} issubstype_elim (TH (Binary' Issubtype tm1 tm2 _ _) sg) = TH (Binder Forall dc1 tm5 [] []) sg where dc1 = Symbol_dec tm1 [] dc2 = Symbol_dec (shift_trm [] 1 tm2) [] tm3 = Sym 1 0 [] [] tm4 = Sym 0 0 [] [] tm5 = Binder Exists dc2 (Binary' Eq' tm3 tm4 [] []) [] [] issubstype_elim _ = TH_Err "issubtype_elim error" {- Equality of types -} eq_of_ty (TH (Binary' Issubtype tm1 tm2 [] []) sg1) (TH (Binary' Issubtype tm3 tm4 [] []) sg2) = if eq_sgn sg1 sg2 && eq_trm tm1 tm4 && eq_trm tm2 tm3 then TH (Binary' Eq' tm1 tm2 [] []) sg1 else TH_Err "eq_of_ty error" eq_of_ty _ _ = TH_Err "eq_of_ty error (2)" {- project the theorem out of a terms subtype -} from (TM tm1 (Binder Subtype dc tm2 _ _) sg) = TH (subst_trm dc tm2 tm1) sg from _ = TH_Err "from: argument must be term of subtype sort" {- definition elimination -} def_elim_thm (TH tm (Extend dc sg _)) = if is_def_dec dc then TH (subst_trm dc1 tm tm1) sg else TH_Err "Definition elimination error" where (dc1,tm1,_) = split_def dc def_elim_thm _ = TH_Err "Definition elimination error (2)" {- weaken a theorem -} weaken (SG sg1) (TH tm sg2) = case is_sub_sgn sg2 sg1 of SOME i -> TH (shift_trm share_map i tm) sg1 where share_map = get_share_map sg1 NONE -> TH_Err "Weaken error" set_Thm_att (TH tm sg) iL att = TH (set_trm_att tm iL att) sg get_Thm_att (TH tm sg) iL = get_trm_att tm iL {- Restore a theorem from the database -} restore_Thm s = error "BadTheorem" -- ** exn {- return the internal representation of a theorem -} internal_Thm (TH tm sg) = (tm,sg) internal_Thm (TH_Err mesg ) = error "add feed to itm via extra itrm ctr" {- database_magic_trm_str = "VTSTRM\^H\^H\^H\^H\^H\^H\^X\^Y" database_magic_sgn_str = "VTSSGN\^H\^H\^H\^H\^H\^H\^X\^Y" database_magic_dec_str = "VTSDEC\^H\^H\^H\^H\^H\^H\^X\^Y" database_magic_thm_str = "VTSTHM\^H\^H\^H\^H\^H\^H\^X\^Y" magic_str_len = length database_magic_trm_str dbase_str = "vts90/lib/dbase/" trm_str = "Term" sgn_str = "Signature" dec_str = "Declaration" thm_str = "Theorem" write_obj magic_str type_str obj file = if test_file full_file_name "f" then False else let val ostr = open_out full_file_name in output (ostr, magic_str); output (ostr, obj); close_out ostr; true end end let val home = get_env_var "HOME" val full_file_name = home ^ "/" ^ dbase_str ^ type_str ^ "/" ^ file fun read_obj exn magic_str type_str file = let val home = get_env_var "HOME" val vtshome = get_env_var "VTS_LIB_DIR" val first_choice = home ^ "/" ^ dbase_str ^ type_str ^ "/" ^ file val second_choice = vtshome ^ "/" ^ dbase_str ^ type_str ^ "/" ^ file val file_name = if test_file first_choice "fr" then first_choice else if test_file second_choice "fr" then second_choice else raise exn val istr = open_in file_name val obj_magic_str = input (istr, magic_str_len) val obj_str = input_to_eof istr in close_in istr; if magic_str = obj_magic_str then obj_str else raise exn end and input_to_eof istr = if end_of_stream istr then "" else let val str1 = input (istr,1024) val str2 = input_to_eof istr in (str1 ^ str2) end val anon_sgn_name_header = "%" fun read file = let val instr = open_in file val str = input_to_eof instr in close_in instr; str end handle Io _ => "" fun write file str = let val outstr = open_out file in output (outstr, str); close_out outstr end fun already_there str dir ("." :: files) = (* skip over . and .. *) already_there str dir files | already_there str dir (".." :: files) = already_there str dir files | already_there str dir (file :: files) = if read (dir ^ file) = str then SOME file else already_there str dir files | already_there str dir [] = NONE fun save_sgn name sgn_rep = let val home = get_env_var "HOME" val sgn_dir = home ^ "/" ^ dbase_str ^ sgn_str ^ "/" val sgs = System.Directory.listDir sgn_dir in case already_there sgn_rep sgn_dir sgs of SOME nm => nm | NONE => (write (sgn_dir ^ anon_sgn_name_header ^ name) sgn_rep; anon_sgn_name_header ^ name) end val a_chr = fromEnum "a" and z_chr = fromEnum "z" and A_chr = fromEnum "A" and Z_chr = fromEnum "Z" and zero_chr = fromEnum "0" and nine_chr = fromEnum "9" and minus_chr = fromEnum "-" and underline_chr = fromEnum "_" and dot_cht = fromEnum "." (* database names must be either: *) (* lower-case alphas a-z *) (* upper-case alphas A-Z *) (* numbers 0-9 *) (* or _ - . *) fun ok_name name = let fun ok_ch ch = (a_chr <= ch andalso ch <= z_chr) orelse (A_chr <= ch andalso ch <= Z_chr) orelse (zero_chr <= ch andalso ch <= nine_chr) orelse (ch = minus_chr) orelse (ch = underline_chr) orelse (ch = dot_cht) in forall ok_ch (map fromEnum (explode name)) end in (* local *) (* STILL TO BE DONE *) (* SORT OUT SIGNATURE SHARING *) fun save_Trm name (TM (tm1,tm2,sg)) = if ok_name name then let val tm1_str = trm_to_str tm1 val tm2_str = trm_to_str tm2 val sg_str = database_magic_sgn_str ^ sgn_to_str sg val sg_nm = save_sgn name sg_str in write_obj database_magic_trm_str trm_str (tm1_str ^ tm2_str ^ sg_nm) name end else false fun save_Sgn name (SG sg) = if ok_name name then let val sg_str = database_magic_sgn_str ^ sgn_to_str sg val sg_nm = save_sgn name sg_str in write_obj database_magic_sgn_str sgn_str sg_nm name end else false fun save_Dec name (DC (dc,sg)) = if ok_name name then let val dc_str = dec_to_str dc val sg_str = database_magic_sgn_str ^ sgn_to_str sg val sg_nm = save_sgn name sg_str in write_obj database_magic_dec_str dec_str (dc_str ^ sg_nm) name end else false fun save_Thm name (TH (tm,sg)) = if ok_name name then let val tm_str = trm_to_str tm val sg_str = database_magic_sgn_str ^ sgn_to_str sg val sg_nm = save_sgn name sg_str in write_obj database_magic_thm_str thm_str (tm_str ^ sg_nm) name end else false fun restore_Trm file = let val obj_str = read_obj BadTerm database_magic_trm_str trm_str file val (tm1, is1) = str_to_trm (mkistring obj_str) val (tm2, is2) = str_to_trm is1 val sg_nm = rest_istring is2 val sgn_rep = read_obj BadSignature database_magic_sgn_str sgn_str sg_nm val (sg, is3) = str_to_sgn (mkistring sgn_rep) in (TM (tm1,tm2,sg)) end fun restore_Sgn file = if ok_name file then let val sg_nm = read_obj BadSignature database_magic_sgn_str sgn_str file val obj_str = read_obj BadSignature database_magic_sgn_str sgn_str sg_nm val (sg, is3) = str_to_sgn (mkistring obj_str) in (SG sg) end else raise BadSignature fun restore_Dec file = let val obj_str = read_obj BadDeclaration database_magic_dec_str dec_str file val (dc, is1) = str_to_dec (mkistring obj_str) val sg_nm = rest_istring is1 val sgn_rep = read_obj BadSignature database_magic_sgn_str sgn_str sg_nm val (sg, is2) = str_to_sgn (mkistring sgn_rep) in (DC (dc,sg)) end fun restore_Thm file = let val obj_str = read_obj BadTheorem database_magic_thm_str thm_str file val (tm, is1) = str_to_trm (mkistring obj_str) val sg_nm = rest_istring is1 val sgn_rep = read_obj BadSignature database_magic_sgn_str sgn_str sg_nm val (sg, is2) = str_to_sgn (mkistring sgn_rep) in (TH (tm,sg)) end end (* local *) -} eq_Trm (TM tm1 _ sg1 ) (TM tm2 _ sg2 ) = eq_trm tm1 tm2 && eq_sgn sg1 sg2 eq_Sgn (SG sg1) (SG sg2) = eq_sgn sg1 sg2 eq_Dec (DC dc1 sg1 ) (DC dc2 sg2 ) = eq_dec dc1 dc2 && eq_sgn sg1 sg2 eq_Thm (TH tm1 sg1) (TH tm2 sg2) = eq_trm tm1 tm2 && eq_sgn sg1 sg2 typ_of_Trm (TM _ tm sg) = TM tm ( typ_of_trm sg tm ) sg typ_of_Dec ( DC dc sg ) = TM tm1 tm2 sg where tm1 = typ_of_dec dc tm2 = typ_of_trm sg tm1 typ_of_Thm ( TH tm sg ) = TM tm ( Constant Bool' [] [] ) sg shift_Trm i (SG sg1) (TM tm1 tm2 sg2) = if eq_sgn sg2 sg3 then TM (shift_trm sm i tm1) (shift_trm sm i tm2) sg1 else TM_Err "shift_Trm: signatures unequal" where sg3 = nth_sgn i sg1 sm = get_share_map sg2 subst_Trm (TM tm1 tm2 (Extend dc sg1 _)) (TM tm3 tm4 sg2) = if eq_sgn sg1 sg2 && eq_trm (typ_of_dec dc) tm4 then TM (subst_trm dc tm1 tm2) (subst_trm dc tm2 tm3) sg1 else TM_Err "subst_Trm: signatures unequal or type of dc unequal to type of second argument" subst_Trm _ _ = TM_Err "subst_Trm: Invalid arguments" sgn_of_Trm (TM _ _ sg) = SG sg sgn_of_Trm (TM_Err mesg ) = SG_Err mesg sgn_of_Dec (DC _ sg) = SG sg sgn_of_Dec (DC_Err mesg ) = SG_Err mesg sgn_of_Thm (TH _ sg) = SG sg sgn_of_Thm (TH_Err mesg ) = SG_Err mesg is_valid_Thm ( TH _ _ ) = True is_valid_Thm _ = False is_valid_Trm ( TM _ _ _ ) = True is_valid_Trm _ = False is_valid_Sgn ( SG _ ) = True is_valid_Sgn _ = False