package Ġcom . github . pro log db . runtime . builtin . lists Ċ Ċ import Ġcom . github . pro log db . async . build Lazy Sequence Ċ import Ġcom . github . pro log db . runtime . Pro log RuntimeException Ċ import Ġcom . github . pro log db . runtime . builtin . native Predicate Ċ import Ġcom . github . pro log db . runtime . query . Predicate Invocation Query Ċ import Ġcom . github . pro log db . runtime . term .* Ċ import Ġcom . github . pro log db . runtime . un ification . Un ification Ċ import Ġcom . github . pro log db . runtime . un ification . Variable Bucket Ċ Ċ /** Ċ Ġ* Ġset (- List , Ġ- List , Ġ+ Atom ) Ċ Ġ* Ċ Ġ* ĠF ul fill s Ġif Ġthe Ġsecond Ġargument Ġdoes Ġnot Ġhave Ġduplicates Ġand Ġintersection Ġbetween Ċ Ġ* Ġthe Ġarguments Ġis Ġequal Ġto Ġthe Ġsecond Ġargument , Ġignoring Ġorder . Ċ Ġ* Ċ Ġ* ĠOf Ġthe Ġfirst Ġtwo Ġarguments , Ġexactly Ġone Ġmust Ġbe Ġinstantiated ; Ġthe Ġother Ġone Ġmust Ġbe Ġun bound . Ċ Ġ* Ċ Ġ* ĠTo Ġcheck Ġfor Ġequality , Ġthe Ġpredicate Ġwith Ġthe Ġfunctor Ġgiven Ġin Ġthe Ġthird Ġargument Ċ Ġ* Ġis Ġconsult ed ; Ġe . g . Ġ` set ([ 1 , Ġ 1 , Ġ 2 ], ĠX , Ġ== )` Ġwould Ġtry Ġto Ġproof Ġ` ==( 1 , Ġ 1 )` Ġto Ġcheck Ċ Ġ* Ġwhether Ġthe Ġtwo Ġ` 1 ` s Ġare Ġequal . Ċ Ġ*/ Ċ internal Ġval ĠSet 3 Builtin Ġ= Ġnative Predicate (" set ", Ġ 3 ) Ġ{ Ġargs , Ġcontext Ġ-> ĊĠĠĠ Ġval Ġarg 0 Ġ= Ġargs [ 0 ] ĊĠĠĠ Ġval Ġarg 1 Ġ= Ġargs [ 1 ] ĊĠĠĠ Ġval Ġcomparator Name Ġ= Ġargs [ 2 ] Ġas ? ĠAtom Ġ?: Ġthrow ĠPro log RuntimeException (" Type Ġerror : Ġargument Ġ 3 Ġto Ġset / 3 Ġmust Ġbe Ġan Ġatom ") ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠTerm > ĠCollection < T >. toSet Using Comparator ( comparator Name : ĠAtom ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠTerm . isEqualTo Acc ording To Comparator ( rhs : ĠTerm ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġbuild Lazy Sequence < Un ification >( principal ) Ġ{ Ġcontext . ful fill Attach ( this , ĠPredicate Invocation Query ( Compound Term ( comparator Name . name , ĠarrayOf ( this @ isEqualTo Acc ording To Comparator , Ġrhs ))), ĠVariable Bucket ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġare Equal Ġ= Ġresult . try Advance () Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġare Equal ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġset List Ġ= Ġmutable ListOf < T >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( set List . none Ġ{ Ġit . isEqualTo Acc ording To Comparator ( e ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset List . add ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġset List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( arg 0 Ġ! is ĠVariable ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( arg 0 Ġ! is ĠPro log List ) Ġthrow ĠPro log RuntimeException (" Type Ġerror : Ġargument Ġ 1 Ġto Ġset / 1 Ġmust Ġbe Ġof Ġtype Ġlist ") ĊĠĠĠĠĠĠĠ Ġif Ġ( arg 0 . tail Ġis ĠVariable ) Ġthrow ĠPro log RuntimeException (" Type Ġerror : Ġtail Ġof Ġargument Ġ 1 Ġto Ġset / 1 Ġnot Ġsufficient ly Ġinstantiated ") ĊĠĠĠĠĠĠĠ Ġif Ġ( arg 1 Ġ! is ĠVariable ) Ġthrow ĠPro log RuntimeException (" Type Ġerror : Ġif Ġargument Ġ 1 Ġto Ġset / 1 Ġis Ġinstantiated , Ġargument Ġ 2 Ġmust Ġbe Ġun bound ") ĊĊĠĠĠĠĠĠĠ Ġval Ġarg 0 as Set Ġ= Ġarg 0 . elements . toSet Using Comparator ( comparator Name ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠVariable Bucket () ĊĠĠĠĠĠĠĠ Ġresult . instantiate ( arg 1 , ĠPro log List ( arg 0 as Set . toList ())) ĊĠĠĠĠĠĠĠ Ġyield ( Un ification ( result )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( arg 1 Ġ! is ĠPro log List ) Ġthrow ĠPro log RuntimeException (" Type Ġerror : Ġif Ġargument Ġ 1 Ġto Ġset / 2 Ġis Ġun bound , Ġargument Ġ 2 Ġmust Ġbe Ġof Ġtype Ġlist ") ĊĠĠĠĠĠĠĠ Ġif Ġ( arg 1 . tail Ġis ĠVariable ) Ġthrow ĠPro log RuntimeException (" Type Ġerror : Ġtail Ġof Ġargument Ġ 2 Ġto Ġset / 1 Ġnot Ġsufficient ly Ġinstantiated ") ĊĊĠĠĠĠĠĠĠ Ġval ĠisSet Ġ= Ġarg 1 . elements . size Ġ== Ġarg 1 . elements . toSet Using Comparator ( comparator Name ). size ĊĠĠĠĠĠĠĠ Ġif Ġ( isSet ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠVariable Bucket () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . instantiate ( arg 0 , Ġarg 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Un ification ( result )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ