/*
 * JUnify - Unification JavaScript Library v0.22
 *
 * Licensed under the revised BSD License.
 * Copyright 2008, Bram Stein
 * All rights reserved.
 */
unification=function(){var O=3131961357;function I(R){return R&&typeof R==="object"&&typeof R.length==="number"&&typeof R.splice==="function"&&!R.propertyIsEnumerable("length")}function N(R){return R&&typeof R==="object"&&!I(R)}function J(R){return R&&typeof R==="function"}function M(R){return R!==null&&typeof R==="boolean"}function K(R){return((typeof R!=="object"||R===null)&&typeof R!=="function")||M(R)}function E(R){return R&&typeof R==="object"&&typeof R.is_variable==="function"&&typeof R.get_name==="function"&&R.is_variable()}function D(R){return R&&R===O}function G(S,R){return{is_variable:function(){return true},get_name:function(){return S},get_type:function(){return R||false}}}function H(R,U){var T;var S;if(E(U)&&R.get_name()===U.get_name()){return true}else{if(E(U)||K(U)){return false}else{if(I(U)){for(T=0;T<U.length;T+=1){if(H(R,U[T])){return true}}return false}else{if(N(U)){for(S in U){if(U.hasOwnProperty(S)&&!J(U[S])){if(H(R,U[S])){return true}}}return false}}}}}function F(R,S){var T;if(S.hasOwnProperty(R.get_name())){T={};T[R.get_name()]=S[R.get_name()]}return T}function L(R,T,S){S[R.get_name()]=T;return S}function C(R,T,S){var U;if(E(T)&&E(R)){return false}else{if(D(R)||D(T)){return S}else{if(R.get_type()!==false&&R.get_type()!==T.constructor){return false}else{U=F(R,S);if(U){return P(U[R.get_name()],T,S)}if(H(R,T)){return false}else{return L(R,T,S)}}}}}function B(X,V,U){var R,T,W,S;R=V.hasOwnProperty("_");W=S=0;for(T in X){if(X.hasOwnProperty(T)&&!J(X[T])){if(T!=="_"){if(V.hasOwnProperty(T)){if(P(X[T],V[T],U)===false){return false}}else{if(!V.hasOwnProperty(T)&&!R){return false}}}W+=1}}R=X.hasOwnProperty("_");for(T in V){if(V.hasOwnProperty(T)&&!J(V[T])){if(T!=="_"){if(X.hasOwnProperty(T)){if(P(X[T],V[T],U)===false){return false}}else{if(!X.hasOwnProperty(T)&&!R){return false}}}S+=1}}if(W===0&&S===0){return U}if(W===0||S===0){return false}return U}function Q(U,T,S){var R;if(U.length===T.length){for(R=0;R<U.length;R+=1){if(P(U[R],T[R],S)===false){return false}}}return S}function P(T,S,R){if(R===false){return false}else{if(E(T)||D(T)){return C(T,S,R)}else{if(E(S)||D(S)){return C(S,T,R)}else{if(K(T)){if(T===S){return R}else{return false}}else{if(K(S)){return false}else{if(I(T)&&I(S)){return Q(T,S,R)}else{if(N(T)&&N(S)){return B(T,S,R)}}}}}}}}function A(V,U){var S,R,T;if(E(V)){return(U.hasOwnProperty("variable")&&U.variable(V))||V}else{if(D(V)){return(U.hasOwnProperty("wildcard")&&U.wildcard())||V}else{if(J(V)){return(U.hasOwnProperty("func")&&U.func(V))||V}else{if(N(V)){for(S in V){if(V.hasOwnProperty(S)&&U.hasOwnProperty("object")&&S!==O){T=U.object(S,V[S]);V[S]=A(T,U)}else{if(V.hasOwnProperty(S)&&S!==O){V[S]=A(V[S],U)}}}return V}else{if(I(V)){for(R=0;R<V.length;R+=1){V[R]=A(V[R],U)}return V}else{return(U.hasOwnProperty("atom")&&U.atom(V))||V}}}}}}return{unify:function(S,R){return P(S,R,{})},visit_pattern:function(S,R){return A(S,R)},variable:G,_:O}}();
