123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384openUtilopenPpopenLocusopenGenredexpropenPputilsletpr_with_occurrencesprkeyword(occs,c)=matchoccswith|AtLeastOneOccurrence->hov1(prc++spc()++keyword"at"++str" +")|AllOccurrences->prc|NoOccurrences->failwith"pr_with_occurrences: no occurrences"|OnlyOccurrencesnl->hov1(prc++spc()++keyword"at"++spc()++hov0(prlist_with_sepspc(pr_or_varint)nl))|AllOccurrencesButnl->hov1(prc++spc()++keyword"at"++str" - "++hov0(prlist_with_sepspc(pr_or_varint)nl))exceptionComplexRedFlagletpr_short_red_flagprr=ifnotr.rBeta||notr.rMatch||notr.rFix||notr.rCofix||notr.rZetathenraiseComplexRedFlagelseifList.is_emptyr.rConstthenifr.rDeltathenmt()elseraiseComplexRedFlagelse(ifr.rDeltathenstr"-"elsemt())++hov0(str"["++prlist_with_sepspcprr.rConst++str"]")letpr_red_flagprr=trypr_short_red_flagprrwithComplexRedFlag->(ifr.rBetathenpr_argstr"beta"elsemt())++(ifr.rMatch&&r.rFix&&r.rCofixthenpr_argstr"iota"else(ifr.rMatchthenpr_argstr"match"elsemt())++(ifr.rFixthenpr_argstr"fix"elsemt())++(ifr.rCofixthenpr_argstr"cofix"elsemt()))++(ifr.rZetathenpr_argstr"zeta"elsemt())++(ifList.is_emptyr.rConstthenifr.rDeltathenpr_argstr"delta"elsemt()elsepr_argstr"delta "++(ifr.rDeltathenstr"-"elsemt())++hov0(str"["++prlist_with_sepspcprr.rConst++str"]"))letpr_unionpr1pr2=function|Inla->pr1a|Inrb->pr2bletpr_red_expr(pr_constr,pr_lconstr,pr_ref,pr_pattern)keyword=function|Redfalse->keyword"red"|Hnf->keyword"hnf"|Simpl(f,o)->keyword"simpl"++(pr_short_red_flagpr_reff)++pr_opt(pr_with_occurrences(pr_unionpr_refpr_pattern)keyword)o|Cbvf->iff.rBeta&&f.rMatch&&f.rFix&&f.rCofix&&f.rZeta&&f.rDelta&&List.is_emptyf.rConstthenkeyword"compute"elsehov1(keyword"cbv"++pr_red_flagpr_reff)|Lazyf->hov1(keyword"lazy"++pr_red_flagpr_reff)|Cbnf->hov1(keyword"cbn"++pr_red_flagpr_reff)|Unfoldl->hov1(keyword"unfold"++spc()++prlist_with_seppr_comma(pr_with_occurrencespr_refkeyword)l)|Foldl->hov1(keyword"fold"++prlist(pr_argpr_constr)l)|Patternl->hov1(keyword"pattern"++pr_arg(prlist_with_seppr_comma(pr_with_occurrencespr_constrkeyword))l)|Redtrue->CErrors.user_errPp.(str"Shouldn't be accessible from user.")|ExtraRedExprs->strs|CbvVmo->keyword"vm_compute"++pr_opt(pr_with_occurrences(pr_unionpr_refpr_pattern)keyword)o|CbvNativeo->keyword"native_compute"++pr_opt(pr_with_occurrences(pr_unionpr_refpr_pattern)keyword)oletpr_red_expr_envenvsigma(pr_constr,pr_lconstr,pr_ref,pr_pattern)=pr_red_expr(pr_constrenvsigma,pr_lconstrenvsigma,pr_ref,pr_patternenvsigma)