diff options
author | johnvg | 2002-02-06 13:50:49 +0000 |
---|---|---|
committer | johnvg | 2002-02-06 13:50:49 +0000 |
commit | 18b70304a4a2e4c8481142a2d48469915e0d0bc0 (patch) | |
tree | a00d8acc0c7425b2d07c72ecf78319702be2013b /frontend/unitype.icl | |
parent | store strictness annotations in SymbolType instead of AType (diff) |
store strictness annotations in SymbolType instead of AType
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@1002 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'frontend/unitype.icl')
-rw-r--r-- | frontend/unitype.icl | 291 |
1 files changed, 185 insertions, 106 deletions
diff --git a/frontend/unitype.icl b/frontend/unitype.icl index ca83155..20189bd 100644 --- a/frontend/unitype.icl +++ b/frontend/unitype.icl @@ -275,41 +275,57 @@ liftTypeApplication modules cons_vars t0=:(TA cons_id=:{type_name,type_index={gl | equal_type_prop type_prop type_prop0 = (False, t0, subst, ls) = (True, TA { cons_id & type_prop = type_prop } cons_args, subst, ls) - where - lift_list :: !{#CommonDefs} !{# BOOLVECT } ![AType] ![TypeKind] !*{!Type} !*LiftState - -> (!Bool,![AType], ![SignClassification], ![PropClassification], !*{!Type}, !*LiftState) - lift_list modules cons_vars [] _ subst ls - = (False, [], [], [], subst, ls) - lift_list modules cons_vars ts0=:[t0:ts] [tk : tks] subst ls - # (changed, t, subst, ls) = lift modules cons_vars t0 subst ls - | changed - # (_, ts, sign_classes, prop_classes, subst, ls) = lift_list modules cons_vars ts tks subst ls - | IsArrowKind tk - # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind t.at_type sign_classes prop_classes - = (True,[t:ts],sign_classes,prop_classes,subst,ls) - = (True,[t:ts],sign_classes,prop_classes,subst,ls) - # (changed, ts, sign_classes, prop_classes, subst, ls) = lift_list modules cons_vars ts tks subst ls - | changed - | IsArrowKind tk - # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind t.at_type sign_classes prop_classes - = (True, [t0:ts], sign_classes,prop_classes, subst, ls) - = (True, [t:ts], sign_classes, prop_classes, subst, ls) - | IsArrowKind tk - # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind t.at_type sign_classes prop_classes - = (False, ts0, sign_classes, prop_classes, subst, ls) - = (False, ts0, sign_classes, prop_classes, subst, ls) - - add_sign_and_prop_of_arrow_kind (TA {type_arity,type_prop} _) sign_classes prop_classes - = ([adjustSignClass type_prop.tsp_sign type_arity : sign_classes], [adjustPropClass type_prop.tsp_propagation type_arity : prop_classes]) - add_sign_and_prop_of_arrow_kind (TempV tmp_var_id) sign_classes prop_classes - | isPositive tmp_var_id cons_vars - = ([PostiveSignClass : sign_classes], [PropClass : prop_classes]) - = ([TopSignClass : sign_classes], [NoPropClass : prop_classes]) - add_sign_and_prop_of_arrow_kind _ sign_classes prop_classes - = ([TopSignClass : sign_classes], [PropClass : prop_classes]) +liftTypeApplication modules cons_vars t0=:(TAS cons_id=:{type_name,type_index={glob_object,glob_module},type_arity,type_prop=type_prop0} cons_args strictness) subst ls + # ({tdi_kinds}, ls) = ls!ls_td_infos.[glob_module].[glob_object] + # (changed,cons_args, sign_classes, prop_classes, subst, ls=:{ls_type_heaps}) = lift_list modules cons_vars cons_args tdi_kinds subst ls + | changed + # (type_prop, th_vars, ls_td_infos) = typeProperties glob_object glob_module sign_classes prop_classes modules ls_type_heaps.th_vars ls.ls_td_infos + ls = { ls & ls_td_infos = ls_td_infos, ls_type_heaps = {ls_type_heaps & th_vars = th_vars}} + | equal_type_prop type_prop type_prop0 + = (True, TAS cons_id cons_args strictness, subst, ls) + = (True, TAS { cons_id & type_prop = type_prop } cons_args strictness, subst, ls) + # (type_prop, th_vars, ls_td_infos) = typeProperties glob_object glob_module sign_classes prop_classes modules ls_type_heaps.th_vars ls.ls_td_infos + ls = { ls & ls_td_infos = ls_td_infos, ls_type_heaps = {ls_type_heaps & th_vars = th_vars}} + | equal_type_prop type_prop type_prop0 + = (False, t0, subst, ls) + = (True, TAS { cons_id & type_prop = type_prop } cons_args strictness, subst, ls) liftTypeApplication modules cons_vars type subst ls = lift modules cons_vars type subst ls +lift_list :: !{#CommonDefs} !{# BOOLVECT } ![AType] ![TypeKind] !*{!Type} !*LiftState + -> (!Bool,![AType], ![SignClassification], ![PropClassification], !*{!Type}, !*LiftState) +lift_list modules cons_vars [] _ subst ls + = (False, [], [], [], subst, ls) +lift_list modules cons_vars ts0=:[t0:ts] [tk : tks] subst ls + # (changed, t, subst, ls) = lift modules cons_vars t0 subst ls + | changed + # (_, ts, sign_classes, prop_classes, subst, ls) = lift_list modules cons_vars ts tks subst ls + | IsArrowKind tk + # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind_in_lift t.at_type cons_vars sign_classes prop_classes + = (True,[t:ts],sign_classes,prop_classes,subst,ls) + = (True,[t:ts],sign_classes,prop_classes,subst,ls) + # (changed, ts, sign_classes, prop_classes, subst, ls) = lift_list modules cons_vars ts tks subst ls + | changed + | IsArrowKind tk + # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind_in_lift t.at_type cons_vars sign_classes prop_classes + = (True, [t0:ts], sign_classes,prop_classes, subst, ls) + = (True, [t:ts], sign_classes, prop_classes, subst, ls) + | IsArrowKind tk + # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind_in_lift t.at_type cons_vars sign_classes prop_classes + = (False, ts0, sign_classes, prop_classes, subst, ls) + = (False, ts0, sign_classes, prop_classes, subst, ls) + +add_sign_and_prop_of_arrow_kind_in_lift (TA {type_arity,type_prop} _) cons_vars sign_classes prop_classes + = ([adjustSignClass type_prop.tsp_sign type_arity : sign_classes], [adjustPropClass type_prop.tsp_propagation type_arity : prop_classes]) +add_sign_and_prop_of_arrow_kind_in_lift (TAS {type_arity,type_prop} _ _) cons_vars sign_classes prop_classes + = ([adjustSignClass type_prop.tsp_sign type_arity : sign_classes], [adjustPropClass type_prop.tsp_propagation type_arity : prop_classes]) +add_sign_and_prop_of_arrow_kind_in_lift (TempV tmp_var_id) cons_vars sign_classes prop_classes + | isPositive tmp_var_id cons_vars + = ([PostiveSignClass : sign_classes], [PropClass : prop_classes]) + = ([TopSignClass : sign_classes], [NoPropClass : prop_classes]) +add_sign_and_prop_of_arrow_kind_in_lift _ cons_vars sign_classes prop_classes + = ([TopSignClass : sign_classes], [PropClass : prop_classes]) + instance lift Type where lift modules cons_vars (TempV temp_var) subst ls @@ -335,6 +351,9 @@ where lift modules cons_vars type=:(TA cons_id cons_args) subst ls=:{ls_type_heaps} # (_, type, ls_type_heaps) = tryToExpand type TA_Multi modules ls_type_heaps = liftTypeApplication modules cons_vars type subst {ls & ls_type_heaps = ls_type_heaps} + lift modules cons_vars type=:(TAS cons_id cons_args _) subst ls=:{ls_type_heaps} + # (_, type, ls_type_heaps) = tryToExpand type TA_Multi modules ls_type_heaps + = liftTypeApplication modules cons_vars type subst {ls & ls_type_heaps = ls_type_heaps} lift modules cons_vars type=:(TempCV temp_var :@: types) subst ls # (changed, var_type, subst, ls) = liftTempTypeVariable modules cons_vars temp_var subst ls (changed_types, types, subst, ls) = lift_list modules cons_vars types subst ls @@ -342,6 +361,8 @@ where = case var_type of TA type_cons cons_args -> (True, TA { type_cons & type_arity = type_cons.type_arity + length types } (cons_args ++ types), subst, ls) + TAS type_cons cons_args strictness + -> (True, TAS { type_cons & type_arity = type_cons.type_arity + length types } (cons_args ++ types) strictness, subst, ls) TempV tv_number -> (True, TempCV tv_number :@: types, subst, ls) TempQV tv_number @@ -461,51 +482,34 @@ where # ({tdi_kinds}, es) = es!es_td_infos.[glob_module].[glob_object] (changed,cons_args, hio_signs, hio_props, (subst,es=:{es_td_infos,es_type_heaps})) = expand_type_list modules cons_vars cons_args tdi_kinds (subst, es) | changed - # (type_prop, th_vars, es_td_infos) = typeProperties glob_object glob_module hio_signs hio_props modules es_type_heaps.th_vars es_td_infos + # (type_prop, th_vars, es_td_infos) = typeProperties glob_object glob_module hio_signs hio_props modules es_type_heaps.th_vars es_td_infos + | equal_type_prop type_prop type_prop0 + # es = { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }} + = (True,TA cons_id cons_args, (subst, es)) + # es = { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }} + = (True,TA { cons_id & type_prop = type_prop } cons_args, (subst, es)) + # (type_prop, th_vars, es_td_infos) = typeProperties glob_object glob_module hio_signs hio_props modules es_type_heaps.th_vars es_td_infos | equal_type_prop type_prop type_prop0 - = (True,TA cons_id cons_args, - (subst, { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }})) - = (True,TA { cons_id & type_prop = type_prop } cons_args, - (subst, { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }})) + # es = { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }} + = (False,t0, (subst, es)) + # es = { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }} + = (True,TA { cons_id & type_prop = type_prop } cons_args, (subst, es)) + expandType modules cons_vars t0=:(TAS cons_id=:{type_name, type_index={glob_object,glob_module},type_prop=type_prop0} cons_args strictness) (subst, es) + # ({tdi_kinds}, es) = es!es_td_infos.[glob_module].[glob_object] + (changed,cons_args, hio_signs, hio_props, (subst,es=:{es_td_infos,es_type_heaps})) = expand_type_list modules cons_vars cons_args tdi_kinds (subst, es) + | changed + # (type_prop, th_vars, es_td_infos) = typeProperties glob_object glob_module hio_signs hio_props modules es_type_heaps.th_vars es_td_infos + | equal_type_prop type_prop type_prop0 + # es = { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }} + = (True,TAS cons_id cons_args strictness, (subst, es)) + # es = { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }} + = (True,TAS { cons_id & type_prop = type_prop } cons_args strictness, (subst, es)) # (type_prop, th_vars, es_td_infos) = typeProperties glob_object glob_module hio_signs hio_props modules es_type_heaps.th_vars es_td_infos | equal_type_prop type_prop type_prop0 - = (False,t0, - (subst, { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }})) - = (True,TA { cons_id & type_prop = type_prop } cons_args, - (subst, { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }})) - where - expand_type_list :: !{#CommonDefs} !{# BOOLVECT } ![AType] ![TypeKind] !(!u:{!Type}, !*ExpansionState) - -> (!Bool,![AType], ![SignClassification], ![PropClassification], !(!u:{!Type}, !*ExpansionState)) - expand_type_list modules cons_vars [] _ es - = (False,[], [], [], es) - expand_type_list modules cons_vars ts0=:[t0:ts] [tk : tks] es - # (changed,t, es) = expandType modules cons_vars t0 es - | changed - # (_,ts, sign_classes, prop_classes, es) = expand_type_list modules cons_vars ts tks es - | IsArrowKind tk - # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind t.at_type sign_classes prop_classes; - = (True,[t:ts], sign_classes, prop_classes, es) - = (True,[t:ts], sign_classes, prop_classes, es) - # (changed,ts, sign_classes, prop_classes, es) = expand_type_list modules cons_vars ts tks es - | changed - | IsArrowKind tk - # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind t.at_type sign_classes prop_classes; - = (True,[t0:ts], sign_classes, prop_classes, es) - = (True,[t0:ts], sign_classes, prop_classes, es) - | IsArrowKind tk - # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind t.at_type sign_classes prop_classes; - = (False,ts0, sign_classes, prop_classes, es) - = (False,ts0, sign_classes, prop_classes, es) - - add_sign_and_prop_of_arrow_kind (TA {type_arity,type_prop} _) sign_classes prop_classes - =([adjustSignClass type_prop.tsp_sign type_arity : sign_classes],[adjustPropClass type_prop.tsp_propagation type_arity : prop_classes]) - add_sign_and_prop_of_arrow_kind ( TempV tmp_var_id) sign_classes prop_classes - | isPositive tmp_var_id cons_vars - = ([PostiveSignClass : sign_classes], [PropClass : prop_classes]) - = ([TopSignClass : sign_classes], [NoPropClass : prop_classes]) - add_sign_and_prop_of_arrow_kind _ sign_classes prop_classes - = ([TopSignClass : sign_classes], [PropClass : prop_classes]) - + # es = { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }} + = (False,t0, (subst, es)) + # es = { es & es_td_infos = es_td_infos, es_type_heaps = { es_type_heaps & th_vars = th_vars }} + = (True,TAS { cons_id & type_prop = type_prop } cons_args strictness, (subst, es)) expandType modules cons_vars type=:(TempCV temp_var :@: types) es # (changed_type, var_type, es) = expandTempTypeVariable temp_var es (changed_types, types, es) = expandType modules cons_vars types es @@ -514,6 +518,9 @@ where TA type_cons=:{type_arity} cons_args # nr_of_new_args = length types -> (True, TA { type_cons & type_arity = type_arity + nr_of_new_args } (cons_args ++ types), es) + TAS type_cons=:{type_arity} cons_args strictness + # nr_of_new_args = length types + -> (True, TAS { type_cons & type_arity = type_arity + nr_of_new_args } (cons_args ++ types) strictness, es) TempV tv_number -> (True, TempCV tv_number :@: types, es) TempQV tv_number @@ -534,6 +541,40 @@ where = (False, type, es) +expand_type_list :: !{#CommonDefs} !{# BOOLVECT } ![AType] ![TypeKind] !(!u:{!Type}, !*ExpansionState) + -> (!Bool,![AType], ![SignClassification], ![PropClassification], !(!u:{!Type}, !*ExpansionState)) +expand_type_list modules cons_vars [] _ es + = (False,[], [], [], es) +expand_type_list modules cons_vars ts0=:[t0:ts] [tk : tks] es + # (changed,t, es) = expandType modules cons_vars t0 es + | changed + # (_,ts, sign_classes, prop_classes, es) = expand_type_list modules cons_vars ts tks es + | IsArrowKind tk + # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind_in_expand t.at_type cons_vars sign_classes prop_classes; + = (True,[t:ts], sign_classes, prop_classes, es) + = (True,[t:ts], sign_classes, prop_classes, es) + # (changed,ts, sign_classes, prop_classes, es) = expand_type_list modules cons_vars ts tks es + | changed + | IsArrowKind tk + # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind_in_expand t.at_type cons_vars sign_classes prop_classes; + = (True,[t0:ts], sign_classes, prop_classes, es) + = (True,[t0:ts], sign_classes, prop_classes, es) + | IsArrowKind tk + # (sign_classes,prop_classes) = add_sign_and_prop_of_arrow_kind_in_expand t.at_type cons_vars sign_classes prop_classes; + = (False,ts0, sign_classes, prop_classes, es) + = (False,ts0, sign_classes, prop_classes, es) + +add_sign_and_prop_of_arrow_kind_in_expand (TA {type_arity,type_prop} _) cons_vars sign_classes prop_classes + =([adjustSignClass type_prop.tsp_sign type_arity : sign_classes],[adjustPropClass type_prop.tsp_propagation type_arity : prop_classes]) +add_sign_and_prop_of_arrow_kind_in_expand (TAS {type_arity,type_prop} _ _) cons_vars sign_classes prop_classes + =([adjustSignClass type_prop.tsp_sign type_arity : sign_classes],[adjustPropClass type_prop.tsp_propagation type_arity : prop_classes]) +add_sign_and_prop_of_arrow_kind_in_expand ( TempV tmp_var_id) cons_vars sign_classes prop_classes + | isPositive tmp_var_id cons_vars + = ([PostiveSignClass : sign_classes], [PropClass : prop_classes]) + = ([TopSignClass : sign_classes], [NoPropClass : prop_classes]) +add_sign_and_prop_of_arrow_kind_in_expand _ cons_vars sign_classes prop_classes + = ([TopSignClass : sign_classes], [PropClass : prop_classes]) + instance expandType [a] | expandType a where expandType modules cons_vars [] es @@ -786,21 +827,17 @@ where | tsp_coercible = sign = TopSign + adjust_sign sign (TAS {type_name, type_prop={tsp_coercible}} _ _) cons_vars + | tsp_coercible + = sign + = TopSign adjust_sign sign _ cons_vars = sign - add_propagation_inequalities cons_vars attr (TA {type_name,type_prop={tsp_propagation}} cons_args) coercions - = add_inequalities tsp_propagation attr cons_args coercions - where - add_inequalities prop_class attr [] coercions - = (True, coercions) - add_inequalities prop_class attr [{at_attribute} : args] coercions - | (prop_class bitand 1) == 0 - = add_inequalities (prop_class >> 1) attr args coercions - # (succ, coercions) = coerceAttributes attr at_attribute PositiveSign coercions - | succ - = add_inequalities (prop_class >> 1) attr args coercions - = (False, coercions) + add_propagation_inequalities cons_vars attr (TA {type_prop={tsp_propagation}} cons_args) coercions + = add_inequalities_for_TA tsp_propagation attr cons_args coercions + add_propagation_inequalities cons_vars attr (TAS {type_prop={tsp_propagation}} cons_args _) coercions + = add_inequalities_for_TA tsp_propagation attr cons_args coercions add_propagation_inequalities cons_vars attr (TempCV tmp_var_id :@: types) coercions | isPositive tmp_var_id cons_vars = add_inequalities attr types coercions @@ -816,9 +853,19 @@ where add_propagation_inequalities cons_vars attr type coercions = (True, coercions) -tryToExpandTypeSyn :: !{#CommonDefs} !{#BOOLVECT} !TypeSymbIdent ![AType] !TypeAttribute !*TypeHeaps !*TypeDefInfos + add_inequalities_for_TA prop_class attr [] coercions + = (True, coercions) + add_inequalities_for_TA prop_class attr [{at_attribute} : args] coercions + | (prop_class bitand 1) == 0 + = add_inequalities_for_TA (prop_class >> 1) attr args coercions + # (succ, coercions) = coerceAttributes attr at_attribute PositiveSign coercions + | succ + = add_inequalities_for_TA (prop_class >> 1) attr args coercions + = (False, coercions) + +tryToExpandTypeSyn :: !{#CommonDefs} !{#BOOLVECT} !Type !TypeSymbIdent ![AType] !TypeAttribute !*TypeHeaps !*TypeDefInfos -> (!Bool, !Type, !*TypeHeaps, !*TypeDefInfos) -tryToExpandTypeSyn defs cons_vars cons_id=:{type_index={glob_object,glob_module}} type_args attribute type_heaps td_infos +tryToExpandTypeSyn defs cons_vars type cons_id=:{type_index={glob_object,glob_module}} type_args attribute type_heaps td_infos # {td_rhs,td_args,td_attribute,td_name} = defs.[glob_module].com_type_defs.[glob_object] = case td_rhs of SynType {at_type} @@ -828,34 +875,57 @@ tryToExpandTypeSyn defs cons_vars cons_id=:{type_index={glob_object,glob_module} -> (True, expanded_type, clearBindingsOfTypeVarsAndAttributes attribute td_args es_type_heaps, es_td_infos) _ - -> (False, TA cons_id type_args, type_heaps, td_infos) + -> (False, type/*TA cons_id type_args*/, type_heaps, td_infos) coerceTypes :: !Sign !{# CommonDefs} !{# BOOLVECT} !TypePosition !AType !AType !*CoercionState -> (!Optional TypePosition, !*CoercionState) -coerceTypes sign defs cons_vars tpos dem_type=:{at_type = TA dem_cons dem_args} off_type=:{at_type = TA off_cons off_args} cs=:{crc_type_heaps, crc_td_infos} +coerceTypes sign defs cons_vars tpos dem_type=:{at_type=type1=:TA dem_cons dem_args} off_type=:{at_type=type2=:TA off_cons off_args} cs=:{crc_type_heaps, crc_td_infos} | dem_cons == off_cons = coercions_of_arg_types sign defs cons_vars tpos dem_args off_args dem_cons.type_prop.tsp_sign 0 cs - # (_, exp_dem_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars dem_cons dem_args dem_type.at_attribute crc_type_heaps crc_td_infos - (_, exp_off_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars off_cons off_args off_type.at_attribute crc_type_heaps crc_td_infos + # (_, exp_dem_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type1 dem_cons dem_args dem_type.at_attribute crc_type_heaps crc_td_infos + (_, exp_off_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type2 off_cons off_args off_type.at_attribute crc_type_heaps crc_td_infos = coerceTypes sign defs cons_vars tpos { dem_type & at_type = exp_dem_type } { off_type & at_type = exp_off_type } { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos } - where - coercions_of_arg_types sign defs cons_vars tpos [t1 : ts1] [t2 : ts2] sign_class arg_number cs - # arg_sign = sign * signClassToSign sign_class arg_number - (succ, cs) = coerce arg_sign defs cons_vars [arg_number : tpos] t1 t2 cs - | Success succ - = coercions_of_arg_types sign defs cons_vars tpos ts1 ts2 sign_class (inc arg_number) cs - = (succ, cs) - coercions_of_arg_types sign defs cons_vars tpos [] [] _ _ cs - = (No, cs) -coerceTypes sign defs cons_vars tpos dem_type=:{at_type = TA dem_cons dem_args} off_type cs=:{crc_type_heaps, crc_td_infos} - # (succ, exp_dem_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars dem_cons dem_args dem_type.at_attribute crc_type_heaps crc_td_infos +coerceTypes sign defs cons_vars tpos dem_type=:{at_type=type1=:TA dem_cons dem_args} off_type=:{at_type=type2=:TAS off_cons off_args _} cs=:{crc_type_heaps, crc_td_infos} + | dem_cons == off_cons + = coercions_of_arg_types sign defs cons_vars tpos dem_args off_args dem_cons.type_prop.tsp_sign 0 cs + # (_, exp_dem_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type1 dem_cons dem_args dem_type.at_attribute crc_type_heaps crc_td_infos + (_, exp_off_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type2 off_cons off_args off_type.at_attribute crc_type_heaps crc_td_infos + = coerceTypes sign defs cons_vars tpos { dem_type & at_type = exp_dem_type } { off_type & at_type = exp_off_type } + { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos } +coerceTypes sign defs cons_vars tpos dem_type=:{at_type=type1=:TAS dem_cons dem_args _} off_type=:{at_type=type2=:TA off_cons off_args} cs=:{crc_type_heaps, crc_td_infos} + | dem_cons == off_cons + = coercions_of_arg_types sign defs cons_vars tpos dem_args off_args dem_cons.type_prop.tsp_sign 0 cs + # (_, exp_dem_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type1 dem_cons dem_args dem_type.at_attribute crc_type_heaps crc_td_infos + (_, exp_off_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type2 off_cons off_args off_type.at_attribute crc_type_heaps crc_td_infos + = coerceTypes sign defs cons_vars tpos { dem_type & at_type = exp_dem_type } { off_type & at_type = exp_off_type } + { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos } +coerceTypes sign defs cons_vars tpos dem_type=:{at_type=type1=:TAS dem_cons dem_args _} off_type=:{at_type=type2=:TAS off_cons off_args _} cs=:{crc_type_heaps, crc_td_infos} + | dem_cons == off_cons + = coercions_of_arg_types sign defs cons_vars tpos dem_args off_args dem_cons.type_prop.tsp_sign 0 cs + # (_, exp_dem_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type1 dem_cons dem_args dem_type.at_attribute crc_type_heaps crc_td_infos + (_, exp_off_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type2 off_cons off_args off_type.at_attribute crc_type_heaps crc_td_infos + = coerceTypes sign defs cons_vars tpos { dem_type & at_type = exp_dem_type } { off_type & at_type = exp_off_type } + { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos } +coerceTypes sign defs cons_vars tpos dem_type=:{at_type=type=:TA dem_cons dem_args} off_type cs=:{crc_type_heaps, crc_td_infos} + # (succ, exp_dem_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type dem_cons dem_args dem_type.at_attribute crc_type_heaps crc_td_infos | succ = coerceTypes sign defs cons_vars tpos { dem_type & at_type = exp_dem_type } off_type { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos } = (No, { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos }) -coerceTypes sign defs cons_vars tpos dem_type off_type=:{at_type = TA off_cons off_args} cs=:{crc_type_heaps, crc_td_infos} - # (succ, exp_off_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars off_cons off_args off_type.at_attribute - crc_type_heaps crc_td_infos +coerceTypes sign defs cons_vars tpos dem_type=:{at_type=type=:TAS dem_cons dem_args _} off_type cs=:{crc_type_heaps, crc_td_infos} + # (succ, exp_dem_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type dem_cons dem_args dem_type.at_attribute crc_type_heaps crc_td_infos + | succ + = coerceTypes sign defs cons_vars tpos { dem_type & at_type = exp_dem_type } off_type + { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos } + = (No, { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos }) +coerceTypes sign defs cons_vars tpos dem_type off_type=:{at_type=type=:TAS off_cons off_args _} cs=:{crc_type_heaps, crc_td_infos} + # (succ, exp_off_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type off_cons off_args off_type.at_attribute crc_type_heaps crc_td_infos + | succ + = coerceTypes sign defs cons_vars tpos dem_type { off_type & at_type = exp_off_type } + { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos } + = (No, { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos }) +coerceTypes sign defs cons_vars tpos dem_type off_type=:{at_type=type=:TA off_cons off_args} cs=:{crc_type_heaps, crc_td_infos} + # (succ, exp_off_type, crc_type_heaps, crc_td_infos) = tryToExpandTypeSyn defs cons_vars type off_cons off_args off_type.at_attribute crc_type_heaps crc_td_infos | succ = coerceTypes sign defs cons_vars tpos dem_type { off_type & at_type = exp_off_type } { cs & crc_type_heaps = crc_type_heaps, crc_td_infos = crc_td_infos } @@ -894,6 +964,15 @@ where coerceTypes sign defs cons_vars tpos _ _ cs = (No, cs) +coercions_of_arg_types sign defs cons_vars tpos [t1 : ts1] [t2 : ts2] sign_class arg_number cs + # arg_sign = sign * signClassToSign sign_class arg_number + (succ, cs) = coerce arg_sign defs cons_vars [arg_number : tpos] t1 t2 cs + | Success succ + = coercions_of_arg_types sign defs cons_vars tpos ts1 ts2 sign_class (inc arg_number) cs + = (succ, cs) +coercions_of_arg_types sign defs cons_vars tpos [] [] _ _ cs + = (No, cs) + AttrRestricted :== 0 instance <<< CoercionTree |