% INPUT %----------------------------------- % assign_sizo(..). sizo(Sizo):- bind_scope(_, assign_sizo(Sizo), strong). dict_sizo(Sizo, Id):- Id= #sum{ 1, SizoLess : sizo(SizoLess), SizoLess < Sizo}; sizo(Sizo). % connect to latex %----------------------------------- latex_registered_subjects(sizo, Sizo):- sizo(Sizo). latex_scope_demand(ScopeDemandSizo, sizo):- bind(Target, demand(sizo)); Target = s(_, _, ScopeDemandSizo). bind_scope(Scope, Sizo, strong):- bind_scope(Scope, assign_sizo(Sizo), strong). % register late query %----------------------------------- late(Target, SymbolSizo, (SizoAny), sizo_current(SizoAny)):- bind(Target, demand(sizo)); Target=s(_, _, TargetS); scope_fn(TargetS, Fn); latex_symbol(Fn, sizo, SymbolSizo); sizo(SizoAny). % polymorphism based on virtualizaion strategy %----------------------------------- late(SymbRet, SymbolSizo, Sizo, dfa_callguard(SymbRet, strategy(Strategy))):- dfa_callfn(SymbRet, FnName); bind_func(FnName, requires(virt_dereference_strategy)); SymbRet=s(_, _, ScopeCaller); scope_fn(ScopeCaller, Fn); latex_symbol(Fn, sizo, SymbolSizo); sizo(Sizo); virt_dereference_strategy(Sizo, Strategy). % IMPLEMENTATION %=========================================================== . sizo_properties(Sizo, Prop):- bind_scope(Scope, define_sizo_prop(Prop), strong); bind_scope(Scope, Sizo, strong); sizo(Sizo). virt_dereference_strategy(SizoOther, prefix):- sizo_properties(Sizo, inner); SizoOther <> Sizo; sizo(SizoOther). virt_dereference_strategy(Sizo, prefix):- sizo_properties(Sizo, outer). virt_dereference_strategy(Sizo, none) :- not virt_dereference_strategy(Sizo, prefix); sizo(Sizo).