package Ġtack y Ċ Ċ // Ġ/ ĠBase Ġclass Ġfor Ġreal izers . Ċ interface ĠReal izer Base Ġ: ĠS ourced Iterator < Map < String , ĠTerm >> Ċ Ċ // Ġ/ ĠReal izer Ġthat Ġaltern atively Ġpull s Ġresults Ġfrom Ġmultiple Ġsub - real izers . Ċ class ĠReal izer Altern ator ( real izers : Ġkotlin . collections . List < Real izer >) Ġ: ĠReal izer Base Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġreal izers Ġ= Ġreal izers . to Mutable List () ĊĊĠĠĠ Ġoverride Ġfun Ġpoll (): ĠMap < String , ĠTerm >? Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( real izers . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġreal izers [ index ]. poll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal izers . remove At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real izers . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ% = Ġreal izers . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ( index Ġ+ Ġ 1 ) Ġ% Ġreal izers . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġnext Element : ĠMap < String , ĠTerm >? Ġ= Ġnull Ċ } Ċ Ċ // Ġ/ ĠStandard Ġgoal Ġreal izer . Ċ class ĠReal izer ( ĊĠĠĠ Ġ// Ġ/ ĠThe Ġgoals Ġto Ġrealize . ĊĠĠĠ Ġprivate Ġval Ġgoals : Ġkotlin . collections . List < Term >, ĊĠĠĠ Ġ// Ġ/ ĠThe Ġknowledge Ġbase . ĊĠĠĠ Ġprivate Ġval Ġknowledge : ĠKnowledge Base , ĊĠĠĠ Ġ// Ġ/ ĠThe Ġbindings Ġalready Ġ Ġdetermined Ġby Ġthe Ġparent Ġreal izer . ĊĠĠĠ Ġprivate Ġval Ġparent Bindings : ĠBinding Map Ġ= Ġmap Of (), ĊĠĠĠ Ġ// Ġ/ ĠThe Ġoptional Ġlogger , Ġfor Ġdebug Ġpurpose . ĊĠĠĠ Ġprivate Ġvar Ġlogger : ĠLogger ? Ġ= Ġnull Ċ ) Ġ: ĠReal izer Base Ġ{ ĊĊĠĠĠ Ġ// Ġ/ ĠAn Ġiterator Ġon Ġthe Ġknowledge Ġclauses Ġto Ġcheck . ĊĠĠĠ Ġprivate Ġvar Ġclause Iterator : ĠIterator < Term >? Ġ= Ġnull ĊĠĠĠ Ġ// Ġ/ ĠThe Ġsub real izer , Ġif Ġany . ĊĠĠĠ Ġprivate Ġvar Ġsub Real izer : ĠReal izer Base ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIdent ify Ġwhich Ġpart Ġof Ġthe Ġknowledge Ġbase Ġthe Ġreal izer Ġshould Ġexplore . ĊĠĠĠĠĠĠĠ Ġif Ġ(!( goals . isNotEmpty ())) Ġ{ Ġthrow ĠAssertionError () Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġgoal Ġ= Ġgoals . first OrNull () !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTerm . Term Internal Ġ-> Ġclause Iterator Ġ= Ġknowledge . predicates [ goal . name ]. let Ġ{ Ġit ?. iterator () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTerm . Rule Internal Ġ-> Ġclause Iterator Ġ= Ġknowledge . predicates [ goal . name ]. let Ġ{ Ġit ?. iterator () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpoll (): ĠMap < String , ĠTerm >? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġhave Ġa Ġsub real izer Ġrunning , Ġpull Ġits Ġresults Ġfirst . ĊĠĠĠĠĠĠĠ Ġval Ġsub Ġ= Ġsub Real izer ĊĠĠĠĠĠĠĠ Ġif Ġ( sub Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsub . poll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult . merged ( other Ġ= Ġparent Bindings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. did Back track () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Real izer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= Ġgoals . first OrNull () !! ĊĠĠĠĠĠĠĠ Ġlogger ?. will Real ize ( goal Ġ= Ġgoal ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġthe Ġbuilt - in Ġ` ~ = ~/ 2 ` Ġpredicate . ĊĠĠĠĠĠĠĠ Ġif Ġ(( goal Ġis ĠTerm . Term Internal ) Ġ&& Ġ( goal . name Ġ== Ġ" lk .~ = ~ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġgoal . arguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( args . size Ġ== Ġ 2 )) Ġ{ Ġthrow ĠAssertionError () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Result Ġ= Ġun ify ( goal Ġ= Ġargs [ 0 ], Ġfact Ġ= Ġargs [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( goals . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Go als Ġ= Ġgoals . drop ( 1 ). map Ġ{ Ġnode Result . deep Walk ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Real izer Ġ= ĠReal izer ( goals Ġ= Ġsub Go als , Ġknowledge Ġ= Ġknowledge , Ġparent Bindings Ġ= Ġnode Result , Ġlogger Ġ= Ġlogger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbranch Result Ġ= Ġsub Real izer !!. poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbranch Result . merged ( other Ġ= Ġparent Bindings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode Result . merged ( other Ġ= Ġparent Bindings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠLook Ġfor Ġthe Ġnext Ġroot Ġclause . ĊĠĠĠĠĠĠĠ Ġfor Ġ( clause Ġin Ġclause Iterator !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. will Attempt ( clause Ġ= Ġclause ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( goal Ġis ĠTerm . Val ) Ġ&& Ġ( clause Ġis ĠTerm . Val ) Ġ&& Ġ( goal . value Ġ== Ġclause . value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( goals . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Go als Ġ= Ġgoals . drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Real izer Ġ= ĠReal izer ( goals Ġ= Ġsub Go als , Ġknowledge Ġ= Ġknowledge , Ġlogger Ġ= Ġlogger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbranch Result Ġ= Ġsub Real izer !!. poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbranch Result . merged ( parent Bindings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(( goal Ġis ĠTerm . Term Internal ) Ġ&& Ġ( clause Ġis ĠTerm . Term Internal )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Result Ġ= Ġun ify ( goal Ġ= Ġgoal , Ġfact Ġ= Ġclause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( goals . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Go als Ġ= Ġgoals . drop ( 1 ). map Ġ{ Ġnode Result . deep Walk ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Real izer Ġ= ĠReal izer ( goals Ġ= Ġsub Go als , Ġknowledge Ġ= Ġknowledge , Ġparent Bindings Ġ= Ġnode Result , Ġlogger Ġ= Ġlogger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbranch Result Ġ= Ġsub Real izer !!. poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbranch Result . merged ( parent Bindings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode Result . merged ( parent Bindings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(( goal Ġis ĠTerm . Term Internal ) Ġ&& Ġ( clause Ġis ĠTerm . Rule Internal )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgoal Name Ġ= Ġgoal . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Name Ġ= Ġclause . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Args Ġ= Ġclause . arguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Body Ġ= Ġclause . body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( goal Name Ġ== Ġrule Name )) Ġ{ Ġthrow ĠAssertionError () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġwe Ġtry Ġto Ġun ify Ġthe Ġrule Ġhead Ġwith Ġthe Ġgoal . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhead : ĠTerm Ġ= ĠTerm . Term Internal ( name Ġ= Ġgoal Name , Ġarguments Ġ= Ġrule Args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Result Ġ= Ġun ify ( goal Ġ= Ġgoal , Ġfact Ġ= Ġhead ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Go als Ġ= Ġgoals . drop ( 1 ). map Ġ{ Ġnode Result . deep Walk ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Go als Ġ= Ġrule Body . goals . map Ġ{ Ġit . map Ġ{ Ġnode Result . deep Walk ( it ) Ġ} Ġ+ Ġsub Go als Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( rule Go als . isNotEmpty ())) Ġ{ Ġthrow ĠAssertionError () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġhave Ġto Ġmake Ġsure Ġbound Ġknowledge Ġvariables Ġare Ġrenamed Ġin Ġthe Ġsub - real izer 's ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġknowledge , Ġotherwise Ġthey Ġmay Ġcol lide Ġwith Ġthe Ġones Ġwe Ġalready Ġbound . ĠFor Ġinstance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconsider Ġa Ġrecursive Ġrule Ġ` p ( q ($ x ), Ġ$ y ) ĠâĬ ¢ Ġp ($ x , Ġq ($ y )) ` Ġand Ġa Ġgoal Ġ` p ($ z , Ġ 0 )`. Ġ`$ z ` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwould Ġget Ġbound Ġto Ġ` q ($ x )` Ġand Ġ`$ y ` Ġto Ġ` 0 ` Ġbefore Ġwe Ġtry Ġsatisfy Ġ` p ($ x , Ġq ( 0 )) `. ĠBut ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġ`$ x ` Ġwasn 't Ġrenamed , Ġwe 'd Ġbe Ġtrying Ġto Ġun ify Ġ`$ x ` Ġwith Ġ` q ($ x )` Ġwhile Ġrecur sing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Knowledge Ġ= Ġknowledge . ren aming ( clause . variables . toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Real izers Ġ= Ġrule Go als . map Ġ{ ĠReal izer ( goals Ġ= Ġit , Ġknowledge Ġ= Ġsub Knowledge , Ġparent Bindings Ġ= Ġnode Result , Ġlogger Ġ= Ġlogger ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Real izer Ġ= Ġif Ġ( sub Real izers . size Ġ> Ġ 1 ) ĠReal izer Altern ator ( real izers Ġ= Ġsub Real izers ) Ġelse Ġsub Real izers [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbranch Result Ġ= Ġsub Real izer !!. poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote Ġthe Ġ` branch Result ` Ġalready Ġcontains Ġthe Ġbindings Ġof Ġ` node Result `, Ġas Ġthe Ġthese ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġhave Ġbeen Ġmerged Ġby Ġsub - real izer . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbranch Result . merged ( parent Bindings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġnext Element : ĠMap < String , ĠTerm >? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġun ify ( goal : ĠTerm , Ġfact : ĠTerm , Ġbindings : ĠBinding Map Ġ= Ġmap Of ()): ĠBinding Map ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSh allow - walk Ġthe Ġterms Ġto Ġun ify . ĊĠĠĠĠĠĠĠ Ġval Ġlhs Ġ= Ġbindings . sh allow Walk ( goal ) ĊĠĠĠĠĠĠĠ Ġval Ġrhs Ġ= Ġbindings . sh allow Walk ( fact ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠEqual Ġterms Ġalways Ġun ify . ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlhs Ġ== Ġrhs Ġ-> Ġreturn Ġbindings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlhs Ġis ĠTerm . Var Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġlhs . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbindings [ name ] Ġ== Ġnull Ġ-> Ġbindings . binding ( name , Ġterm Ġ= Ġrhs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbindings [ name ] Ġ== Ġrhs Ġ-> Ġbindings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrhs Ġis ĠTerm . Var Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġrhs . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbindings [ name ] Ġ== Ġnull Ġ-> Ġbindings . binding ( name , Ġterm Ġ= Ġlhs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbindings [ name ] Ġ== Ġlhs Ġ-> Ġbindings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( lhs Ġis ĠTerm . Val ) Ġ&& Ġ( rhs Ġis ĠTerm . Val ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl value Ġ= Ġlhs . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr value Ġ= Ġrhs . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( l value Ġ== Ġr value ) Ġbindings Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( lhs Ġis ĠTerm . Term Internal ) Ġ&& Ġ( rhs Ġis ĠTerm . Term Internal ) Ġ&& Ġ( lhs . name Ġ== Ġrhs . name ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl args Ġ= Ġlhs . arguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr args Ġ= Ġrhs . arguments ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġboth Ġterms Ġare Ġof Ġsame Ġar ity . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl args . size Ġ!= Ġr args . size Ġ-> Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġun ify Ġsub terms Ġ( i . e . Ġarguments ). ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUn ification Ġsucceeded . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġintermediate Result Ġ= Ġbindings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( l arg , Ġr arg ) Ġin Ġl args Ġzip Ġr args ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġun ify ( goal Ġ= Ġl arg , Ġfact Ġ= Ġr arg , Ġbindings Ġ= Ġintermediate Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintermediate Result Ġ= Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUn ification Ġsucceeded . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġintermediate Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ