package Ġcore Ċ Ċ sealed Ġclass ĠTerm Ġ{ Ċ ĉ data Ġclass ĠVar ( internal Ġval Ġid : ĠString ): ĠTerm () Ġ{ Ċĉ ĉ fun Ġget Fresh Var ( old Vars : ĠSet < Var >): ĠVar Ġ{ Ċĉĉ ĉ if Ġ( this Ġ! in Ġold Vars ) Ġ{ Ġreturn Ġthis Ġ} Ċĉĉ ĉ val Ġregex Ġ= Ġ"_ [ \\ d ]+ ". to Regex () Ċĉĉ ĉ val Ġpre Id Ġ= Ġregex . replace ( id , Ġ"") Ċĉĉ ĉ var Ġn Ġ= Ġregex . find ( id )?. value ?. drop ( 1 )?. toInt () Ġ?: Ġ 1 Ċĉĉ ĉ while Ġ( true ) Ġ{ Ċĉĉĉ ĉ val Ġnew Var Ġ= ĠVar ( pre Id Ġ+ Ġ"_ $ n ") Ċĉĉĉ ĉ if Ġ( new Var Ġ! in Ġold Vars ) Ġ{ Ġreturn Ġnew Var Ġ} Ċĉĉĉ ĉ n ++ Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ ĉ data Ġclass ĠUn ification Term ( val Ġid : ĠInt , Ġval Ġavailable Vars : ĠSet < Var >): ĠTerm () Ċ ĉ data Ġclass ĠFunction ( val Ġid : ĠString , Ġval Ġterms : ĠList < Term >): ĠTerm () Ċ ĉ object ĠDummy : ĠTerm () Ċ ĉ final Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġwhen ( this ) Ġ{ Ċĉ ĉ is ĠVar Ġ-> Ġid Ċĉ ĉ is ĠUn ification Term Ġ-> Ġ" t _$ id " Ġ+ Ġavailable Vars . join ToString ( separator Ġ= Ġ",", Ġprefix Ġ= Ġ" (", Ġpostfix Ġ= Ġ") ") Ċĉ ĉ is ĠFunction Ġ-> Ġid Ġ+ Ġterms . join ToString ( separator Ġ= Ġ",", Ġprefix Ġ= Ġ" (", Ġpostfix Ġ= Ġ") ") Ċĉ ĉ Dummy Ġ-> Ġ"\\ _" Ċ ĉ } Ċ ĉ val Ġfree Vars : ĠSet < Var > Ċĉ ĉ get () Ġ= Ġwhen Ġ( this ) Ġ{ Ċĉĉ ĉ is ĠVar Ġ-> Ġset Of ( this ) Ċĉĉ ĉ is ĠUn ification Term Ġ-> Ġavailable Vars Ċĉĉ ĉ is ĠFunction Ġ-> Ġterms . map Ġ{ Ġit . free Vars Ġ}. flatten (). toSet () Ċĉĉ ĉ Dummy Ġ-> Ġempty Set () Ċĉ ĉ } Ċ ĉ val Ġun ification Terms : ĠSet < Un ification Term > Ċĉ ĉ get () Ġ= Ġwhen Ġ( this ) Ġ{ Ċĉĉ ĉ is ĠVar Ġ-> Ġempty Set () Ċĉĉ ĉ is ĠUn ification Term Ġ-> Ġset Of ( this ) Ċĉĉ ĉ is ĠFunction Ġ-> Ġterms . map Ġ{ Ġit . un ification Terms Ġ}. flatten (). toSet () Ċĉĉ ĉ Dummy Ġ-> Ġempty Set () Ċĉ ĉ } Ċ ĉ val Ġfunction Ids : ĠSet < String > Ċĉ ĉ get () Ġ= Ġwhen Ġ( this ) Ġ{ Ċĉĉ ĉ is ĠVar Ġ-> Ġempty Set () Ċĉĉ ĉ is ĠUn ification Term Ġ-> Ġempty Set () Ċĉĉ ĉ is ĠFunction Ġ-> Ġset Of ( id ) Ġ+ Ġterms . map Ġ{ Ġit . function Ids Ġ}. flatten () Ċĉĉ ĉ Dummy Ġ-> Ġempty Set () Ċĉ ĉ } Ċ ĉ fun Ġreplace ( old Var : ĠVar , Ġnew Term : ĠTerm ): ĠTerm Ġ= Ġwhen ( this ) Ġ{ Ċĉ ĉ is ĠVar Ġ-> Ġif Ġ( this Ġ== Ġold Var ) Ġnew Term Ġelse Ġthis Ċĉ ĉ is ĠUn ification Term Ġ-> Ġthis Ċĉ ĉ is ĠFunction Ġ-> ĠFunction ( id , Ġterms . map Ġ{ Ġit . replace ( old Var , Ġnew Term ) Ġ}) Ċĉ ĉ Dummy Ġ-> Ġthis Ċ ĉ } Ċ ĉ fun Ġreplace ( old Un ification Term : ĠUn ification Term , Ġnew Term : ĠTerm ): ĠTerm Ġ= Ġwhen ( this ) Ġ{ Ċĉ ĉ is ĠVar Ġ-> Ġthis Ċĉ ĉ is ĠUn ification Term Ġ-> Ġif Ġ( this Ġ== Ġold Un ification Term ) Ġnew Term Ġelse Ġthis Ċĉ ĉ is ĠFunction Ġ-> ĠFunction ( id , Ġterms . map Ġ{ Ġit . replace ( old Un ification Term , Ġnew Term ) Ġ}) Ċĉ ĉ Dummy Ġ-> Ġthis Ċ ĉ } Ċ ĉ fun Ġreplace ( subst itution : ĠSubst itution ): ĠTerm Ġ{ Ċĉ ĉ var Ġresult Ġ= Ġthis Ċĉ ĉ subst itution . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġresult Ġ= Ġresult . replace ( key , Ġvalue ) Ġ} Ċĉ ĉ return Ġresult Ċ ĉ } Ċ } Ċ Ċ type alias ĠSubst itution Ġ= ĠMap < Term . Un ification Term , ĠTerm > Ċ