> module Build_Tm where
> import Unparse
> import Kernel
> import Sub_Core1
> import Sub_Core2
> import Sub_Core3
> import Sub_Core4
> import Type_defs
> import Core_datatype
> import Vtslib
> build_trm :: Sgn -> Flagged_ITrm -> Trm
> build_trm sg ( Opnd ( Itrm itm ))
> = build_trm' sg itm
> build_trm ( SG sg ) oth
> = error ("Error: " ++ unparse sg oth ++ "|\n")
> build_trm' sg ( Sym i j tyL attL )
> = add_l ( symbol sg i j ) tyL attL
> build_trm' sg ( App itm1 itm2 tyL attL )
> = add_l ( appl tm1 tm2 ) tyL attL
> where
> tm1 = build_trm' sg itm1
> tm2 = build_trm' sg itm2
have to deduce term if not explicitely given (type is U-1)
> build_trm' sg ( Pair itm1 itm2 itm3 tyL attL )
> = add_l ( pair tm1 tm2 tm3 ) tyL attL
> where
> tm1 = build_trm' sg itm1
> tm2 = build_trm' sg itm2
> tm3 = case itm3 of
> Constant ( Univ (-1)) _ _
> -> sigma btm2
> where
> btm2 = shift_Trm 1 sg2 ( typ_of_Trm tm2 )
> sg2 = extend bdc1 sg
> bdc1 = symbol_dec ( typ_of_Trm tm1 )
> _ -> build_trm' sg itm3
> build_trm' sg ( Binder bdr idc itm tyL attL )
> = add_l ( bdr_fn tm ) tyL attL
> where
> tm = build_trm' ( extend dc sg ) itm
> dc = gen_dc sg idc
> bdr_fn = case bdr of
> Lambda -> lambda
> Forall -> universal
> Imp -> implication
> Exists -> existential
> Pi -> pi'
> Sigma -> sigma
> Subtype -> subtype
> Delta -> \ _ -> TM_Err "Invalid occurance of \196"
> Choose -> \ _ -> TM_Err "Invalid occurance of \229"
> build_trm' sg ( Constant cst tyL attL )
> = add_l ( cst_fn sg ) tyL attL
> where
> cst_fn = case cst of
> Bool' -> bool_sm
> T -> true_sm
> F -> false_sm
> Univ i -> \sg -> universe sg i
> build_trm' sg ( Binary' b_op itm1 itm2 tyL attL )
> = add_l ( bin_fn tm1 tm2 ) tyL attL
> where
> tm1 = build_trm' sg itm1
> tm2 = build_trm' sg itm2
> bin_fn = case b_op of
> And -> conjunction
> Or -> disjunction
> Eq' -> equal
> Issubtype -> issubtype
> build_trm' sg ( Unary Not itm tyL attL )
> = add_l ( negation tm ) tyL attL
> where
> tm = build_trm' sg itm
> build_trm' sg ( Cond idc itm1 itm2 tyL attL )
> = add_l ( conditional tm1 tm2 ) tyL attL
> where
> tm1 = build_trm' sg2 itm1
> tm2 = build_trm' sg3 itm2
> sg2 = extend dc1 sg
> sg3 = extend dc2 sg
> dc2 = symbol_dec ( negation ( typ_of_Dec dc1 ))
> dc1 = gen_dc sg idc
> build_trm' sg ( Const i j k tyL attL )
> = add_l ( constructor sg i j k ) tyL attL
> build_trm' sg ( Recurse itmL itm tyL attL )
> = add_l ( recurse tmL tm ) tyL attL
> where
> tmL = map ( build_trm' sg ) itmL
> tm = build_trm' sg itm
> build_trm' sg ( Tagid ( str , _ , cnv_fnL ) argL )
> = case fetch_fn cnv_fnL of
> Ok cnv_fn -> cnv_fn argL
> Bad mesg -> TM_Err mesg
> where
>-- fetch_fn :: [Cnv_Fn] -> MayBe ( [Tag_Arg] -> Trm )
> fetch_fn ( Trm_Fn fn : _ ) = Ok fn
> fetch_fn ( _ : oth ) = fetch_fn oth
> fetch_fn [] = Bad ( "cannot convert tag " ++ str ++ " to term" )
> build_trm' ( SG isg ) oth
> = error ("Unimplemented construction: " ++ unparse' isg oth ++ "|\n")
> build_dc = gen_dc
Check type of itm and build axiom_dec if bool
> gen_dc sg ( Symbol_dec itm attL )
> = case typ_of_trm isg itm of
> Constant Bool' _ _
> -> set_Dec_att ( axiom_dec ( build_trm' sg itm )) attL
> otherwise
> -> set_Dec_att ( symbol_dec ( build_trm' sg itm )) attL
> where
> isg = internal_Sgn sg
> gen_dc sg ( Axiom_dec itm attL )
> = set_Dec_att ( axiom_dec ( build_trm' sg itm )) attL
> gen_dc sg ( Decpair idc1 idc2 attL )
> = set_Dec_att dc_pair attL
> where
> dc_pair = decpair dc2
> dc2 = gen_dc sg2 idc2
> sg2 = extend dc1 sg
> dc1 = gen_dc sg idc1
> gen_dc _ _ = error "Only symbol_dec so far implemented"
pass on nested errors unchanged
> add_l ( TM_Err mesg ) _ _ = TM_Err mesg
check validity of sort at head of sort list if present
> add_l tm tyL@( srt : _ ) attL
> = if eq_trm srt_tm srt
> then set_Trm_att tm [] attL
> else TM_Err "Invalid type specification"
> where
> ( _ , srt_tm , _ ) = internal_Trm tm
> add_l tm [] attL
> = set_Trm_att tm [] attL
this function ignores attributes
> build_sg :: ISgn -> Sgn
> build_sg ( Empty _ ) = empty
> build_sg ( Extend idc isg _ )
> = extend ( build_dc sg idc ) sg
> where
> sg = build_sg isg
> build_sg _ = error "unimplemented signature constructor"
|