package Ġit . uni bo . tup ro log . core . impl Ċ Ċ import Ġit . uni bo . tup ro log . core . Clause Ċ import Ġit . uni bo . tup ro log . core . Clause . Companion . body Well For med Visitor Ċ import Ġit . uni bo . tup ro log . core . Clause . Companion . of Ċ import Ġit . uni bo . tup ro log . core . Rule Ċ import Ġit . uni bo . tup ro log . core . Scope Ċ import Ġit . uni bo . tup ro log . core . Struct Ċ import Ġit . uni bo . tup ro log . core . Term Ċ import Ġit . uni bo . tup ro log . core . Term Visitor Ċ import Ġit . uni bo . tup ro log . core . Terms . CLA USE _ FUN CTOR Ċ import Ġit . uni bo . tup ro log . core . Tuple Ċ import Ġit . uni bo . tup ro log . utils . insert At Ċ Ċ internal Ġabstract Ġclass ĠClause Impl ( ĊĠĠĠ Ġoverride Ġval Ġhead : ĠStruct ?, ĊĠĠĠ Ġoverride Ġval Ġbody : ĠTerm , ĊĠĠĠ Ġtags : ĠMap < String , ĠAny > Ċ ) Ġ: ĠAbstract Struct ( CLA USE _ FUN CTOR , Ġ( if Ġ( head Ġ=== Ġnull ) ĠlistOf ( body ) Ġelse ĠlistOf ( head , Ġbody )), Ġtags ), ĠClause Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġis Well For med : ĠBoolean Ġby Ġlazy Ġ{ Ġbody . accept ( body Well For med Visitor ) Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġfunctor : ĠString Ġ= Ġsuper < Clause >. functor ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( head ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ"$ functor Ġ$ body " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"$ head Ġ$ functor Ġ$ body " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġoverride Ġfun Ġcopy With Tags ( tags : ĠMap < String , ĠAny >): ĠClause ĊĊĠĠĠ Ġoverride Ġfun Ġfresh Copy (): ĠClause Ġ= Ġsuper . fresh Copy (). cast To Clause () ĊĊĠĠĠ Ġoverride Ġfun Ġfresh Copy ( scope : ĠScope ): ĠClause Ġ= Ġsuper . fresh Copy ( scope ). cast To Clause () ĊĊĠĠĠ Ġprivate Ġval Ġbody Items Sequence : ĠSequence < Term > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbody . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Tuple Ġ-> Ġit . cast To Tuple (). to Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsequence Of ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġbody Items : ĠIterable < Term > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbody Items Sequence . as Iterable () ĊĊĠĠĠ Ġoverride Ġval Ġbody Size : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbody . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Tuple Ġ-> Ġit . cast To Tuple (). size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġbody As Tuple : ĠTuple ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbody . as Tuple () ĊĊĠĠĠ Ġprivate Ġfun Ġensure Index IsIn Body Range ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġbody Size ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 Ġ|| Ġindex Ġ>= Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIndex OutOfBoundsException (" Attempt Ġto Ġaccess Ġbody Ġitem Ġ$ index Ġof Ġa Ġclause Ġhaving Ġ$ size Ġbody Ġitems ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Body Item ( index : ĠInt ): ĠTerm Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Index IsIn Body Range ( index ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbody Items Sequence . drop ( index ). first () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Head ( head : ĠStruct ): ĠRule Ġ= ĠRule . of ( head , Ġbody ) ĊĊĠĠĠ Ġoverride Ġfun Ġset Body ( body : ĠTerm ): ĠClause Ġ= Ġof ( head , Ġbody ) ĊĊĠĠĠ Ġoverride Ġfun Ġset Head Functor ( functor : ĠString ): ĠClause Ġ= Ġof ( head ?. set Functor ( functor ), Ġbody ) ĊĊĠĠĠ Ġoverride Ġfun Ġset Head Args ( var arg Ġarguments : ĠTerm ): ĠClause Ġ= Ġof ( head ?. set Args (* arguments ), Ġbody ) ĊĊĠĠĠ Ġoverride Ġfun Ġset Head Args ( arguments : ĠIterable < Term >): ĠClause Ġ= Ġof ( head ?. set Args ( arguments ), Ġbody ) ĊĊĠĠĠ Ġoverride Ġfun Ġset Head Args ( arguments : ĠSequence < Term >): ĠClause Ġ= Ġof ( head ?. set Args ( arguments ), Ġbody ) ĊĊĠĠĠ Ġoverride Ġfun Ġinsert Head Arg ( index : ĠInt , Ġargument : ĠTerm ): ĠClause Ġ= Ġof ( head ?. insert At ( index , Ġargument ), Ġbody ) ĊĊĠĠĠ Ġoverride Ġfun Ġadd First Head Arg ( argument : ĠTerm ): ĠClause Ġ= Ġof ( head ?. add First ( argument ), Ġbody ) ĊĊĠĠĠ Ġoverride Ġfun Ġadd Last Head Arg ( argument : ĠTerm ): ĠClause Ġ= Ġof ( head ?. add Last ( argument ), Ġbody ) ĊĊĠĠĠ Ġoverride Ġfun Ġappend Head Arg ( argument : ĠTerm ): ĠClause Ġ= Ġadd Last Head Arg ( argument ) ĊĊĠĠĠ Ġoverride Ġfun Ġset Body Items ( argument : ĠTerm , Ġvar arg Ġarguments : ĠTerm ): ĠClause Ġ= Ġof ( head , Ġargument , Ġ* arguments ) ĊĊĠĠĠ Ġoverride Ġfun Ġset Body Items ( arguments : ĠIterable < Term >): ĠClause Ġ= Ġof ( head , Ġarguments ) ĊĊĠĠĠ Ġoverride Ġfun Ġset Body Items ( arguments : ĠSequence < Term >): ĠClause Ġ= Ġof ( head , Ġarguments ) ĊĊĠĠĠ Ġoverride Ġfun Ġinsert Body Item ( index : ĠInt , Ġargument : ĠTerm ): ĠClause Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Index IsIn Body Range ( index ) ĊĠĠĠĠĠĠĠ Ġreturn Ġof ( head , Ġbody Items Sequence . insert At ( index , Ġargument )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd First Body Item ( argument : ĠTerm ): ĠClause Ġ= Ġof ( head , Ġsequence Of ( argument ) Ġ+ Ġbody Items Sequence ) ĊĊĠĠĠ Ġoverride Ġfun Ġadd Last Body Item ( argument : ĠTerm ): ĠClause Ġ= Ġof ( head , Ġbody Items Sequence Ġ+ Ġsequence Of ( argument )) ĊĊĠĠĠ Ġoverride Ġfun Ġappend Body Item ( argument : ĠTerm ): ĠClause Ġ= Ġadd Last Body Item ( argument ) ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġaccept ( visitor : ĠTerm Visitor < T >): ĠT Ġ= Ġvisitor . visit Clause ( this ) Ċ } Ċ