\ split(Xs, X, Ls, Gs): Xs is a list, Ls is a list of (the occurrences of) \ the elements of Xs that compare less than or equal to pivot X, Gs is a \ list of (the occurrences of) the elements of Xs that compare greater than \ pivot X. \ Prolog code: \ split([], _X, [], []). \ split([X|Xs], X, [X|Ls], Gs) :- \ split(Xs, X, Ls, Gs). \ split([L|Xs], X, [L|Ls], Gs) :- \ compare_terms(less, L, X), \ split(Xs, X, Ls, Gs). \ split([G|Xs], X, Ls, [G|Gs]) :- \ compare_terms(greater, G, X), \ split(Xs, X, Ls, Gs). \ Manual translation to WAM code (NOT TESTED): \ begin general code for split : split s" ' split-clause-1" evaluate execute ; \ end general code for split \ begin code for clause 1 of split : split-clause-1 s" ' split-clause-2" try_me_else \ split( \ ." split clause 1" cr a1 get_nil \ [], \ ignore a2 \ _X, a3 get_nil \ [], a4 get_nil \ [] \ prolog-success @ if ." matched fact 1" cr endif proceed ; \ ). \ end code for clause 1 of split \ begin code for clause 2 of split : split-clause-2 s" ' split-clause-3" try_me_else \ split( \ ." split clause 2" cr a1 get_list \ [ a2 unify_value \ X| x5 unify_variable \ Xs], X, a3 get_list \ [ a2 unify_value \ X| x6 unify_variable \ Ls], Gs) :- \ prolog-success @ if ." matched head 2" cr endif x5 a1 put_value \ split(Xs, X, x6 a3 put_value \ Ls, Gs s" ' split" pl-execute \ ). ; \ end code for clause 2 of split \ begin code for clause 3 of split : split-clause-3 s" ' split-clause-4" try_me_else \ split( \ ." split clause 3" cr wam-allocate a1 get_list \ [ y1 unify_variable \ L| y2 unify_variable \ Xs], y3 a2 get_variable \ X, a3 get_list \ [ y1 unify_value \ L| y4 unify_variable \ Ls], y5 a4 get_variable \ Gs) :- \ prolog-success @ if ." matched head 3" cr endif s" less" a1 put_atom \ compare_terms(less, y1 a2 put_value \ L, y3 a3 put_value \ X s" ' compare_terms" pl-call \ ), y2 a1 put_value \ split(Xs, y3 a2 put_value \ X, y4 a3 put_value \ Ls, y5 a4 put_value \ Gs wam-deallocate s" ' split" pl-execute \ ). ; \ end code for clause 3 of split \ begin code for clause 4 of split : split-clause-4 \ s" ' split-clause-5" try_me_else \ split( s" ' pl-fail" try_me_else \ split( \ ." split clause 4" cr wam-allocate a1 get_list \ [ y1 unify_variable \ G| y2 unify_variable \ Xs], y3 a2 get_value \ X, y4 a3 get_value \ Ls, a4 get_list \ [ y1 unify_value \ G| y5 unify_variable \ Gs]) :- \ prolog-success @ if ." matched head 4" cr else \ ." failing goal: split(" \ a1 @ unparse ." , " \ a2 @ unparse ." , " \ a3 @ unparse ." , " \ a4 @ unparse ." )" cr \ endif s" greater" a1 put_atom \ compare_terms(greater, y1 a2 put_value \ G, y3 a3 put_value \ X s" ' compare_terms" pl-call \ ), y2 a1 put_value \ split(Xs, y3 a2 put_value \ X, y4 a3 put_value \ Ls, y5 a4 put_value \ Gs wam-deallocate s" ' split" pl-execute \ ). ; \ end code for clause 4 of split \ begin code for clause 5 of split \ : split-clause-5 pl-fail ; \ end code for clause 5 of split \ TESTS \ split([1,2,3], 1, Ls, Gs). 1 create-integer create one , 2 create-integer create two , 3 create-integer create three , 4 create-integer create four , 5 create-integer create five , one @ two @ three @ create-nil create-list create-list create-list create numbers , 0 create-integer create pivot-zero , 1 create-integer create pivot-one , 2 create-integer create pivot-two , 3 create-integer create pivot-three , create-unbound create ls , create-unbound create gs , ." :- split([1,2,3], 0, Ls, Gs)" cr clear-query-vars numbers @ a1 ! pivot-zero @ a2 ! s" Ls" 1 register-query-var \ Ls is in variable register Y1 create-unbound ls ! ls @ a3 ! ls @ y1 ! s" Gs" 2 register-query-var \ Gs is in variable register Y2 create-unbound gs ! gs @ a4 ! gs @ y2 ! ' split prolog-shell cr ." :- split([1,2,3], 1, Ls, Gs)" cr clear-query-vars numbers @ a1 ! pivot-one @ a2 ! s" Ls" 1 register-query-var \ Ls is in variable register Y1 create-unbound ls ! ls @ a3 ! ls @ y1 ! s" Gs" 2 register-query-var \ Gs is in variable register Y2 create-unbound gs ! gs @ a4 ! gs @ y2 ! ' split prolog-shell cr ." :- split([1,2,3], 2, Ls, Gs)" cr clear-query-vars numbers @ a1 ! pivot-two @ a2 ! s" Ls" 1 register-query-var \ Ls is in variable register Y1 create-unbound ls ! ls @ a3 ! ls @ y1 ! s" Gs" 2 register-query-var \ Gs is in variable register Y2 create-unbound gs ! gs @ a4 ! gs @ y2 ! ' split prolog-shell cr ." :- split([1,2,3], 3, Ls, Gs)" cr clear-query-vars numbers @ a1 ! pivot-three @ a2 ! s" Ls" 1 register-query-var \ Ls is in variable register Y1 create-unbound ls ! ls @ a3 ! ls @ y1 ! s" Gs" 2 register-query-var \ Gs is in variable register Y2 create-unbound gs ! gs @ a4 ! gs @ y2 ! ' split prolog-shell cr ." :- split(Xs, 3, [1,2], [4,5])" cr clear-query-vars create-unbound create xs , s" Xs" 1 register-query-var one @ two @ create-nil create-list create-list create lowers , four @ five @ create-nil create-list create-list create uppers , xs @ a1 ! xs @ y1 ! pivot-three @ a2 ! lowers @ a3 ! uppers @ a4 ! ' split prolog-shell cr