The algorithm implemented here is due to P. M. Whitman (Free lattices, Annals of Math. (2) 42 (1941), 325-330), as presented in Listing 11.16 by R. Freese, J. Jezek and J. B. Nation in "Free Lattices", Math. Surveys and Monographs, Amer. Math. Soc., 1995, viii+293 pages.
The (in)equations are in the language of lattices, using the following LaTeX or ascii symbols:
Enter a string:
${}$Max depth: Max arity: Variables:
Here is Whitman's algorithm in JavaScript:
// x+y*z+w is represented internally as ["+",["x",["*",["y","z"]],"w"]] val={} // global hash table to record computed subterms function setval(u,v,bool) { if (val[u]==undefined) val[u]={} val[u][v]=bool return bool } function leq(u,v) { // Whitman's algorithm, as in Listing 11.16 in // Freese-Jezek-Nation's book "Free Lattices", Amer. Math. Soc., 1995 var i if (val[u]!=undefined && val[u][v]!=undefined) return val[u][v] if (u[0]!="+" && u[0]!="*" && v[0]!="+" && v[0]!="*") return u[0]==v[0] if (u[0]=="+") { for (i in u[1]) if (!leq(u[1][i],v)) return false return true } if (v[0]=="*") { for (i in v[1]) if (!leq(u,v[1][i])) return false return true } if (u[0]!="+" && u[0]!="*") { for (i in v[1]) if (leq(u,v[1][i])) return setval(u,v[1][i],true) return setval(u,v,false) } if (v[0]!="+" && v[0]!="*") { for (i in u[1]) if (leq(u[1][i],v)) return setval(u[1][i],v,true) return setval(u,v,false) } for (i in u[1]) if (leq(u[1][i],v)) return setval(u[1][i],v,true) for (i in v[1]) if (leq(u,v[1][i])) return setval(u,v[1][i],true) return setval(u,v,false) }