/**********   Meta-Interpreter for basic SEL in SEL  ***********/
/**********   (i.e., no closures, no modes, etc.     ***********/

mode none.
closure none. 

reduce({E\T})     equals {reduce(E) \ reduce(T)}.
reduce([H|T])     equals [reduce(H) | reduce(T)].
reduce(univ(F,L)) equals reduce(kind(F),F,reduce(L)).
reduce(X)         equals X.   /* for constants */

	reduce(subset,F,L) equals big_U(reduce(clause(univ(F,L)))).
	reduce(equation,F,L) equals reduce(clause(univ(F,L))).
	reduce(neither,F,L)  equals univ(F,L).
				
		big_U({{X\_}\_}) contains {X}.


/******* Meta-information about User-defined Functions ******/

        kind(app) equals equation.	/* equation = equational clause */
        kind(rev) equals equation.	
        kind(len) equals equation.
        kind(succ) equals equation.
        kind(size) equals equation.

        kind(perms) equals subset.	/* subset = subset clause */
        kind(distr) equals subset.	
        kind(_) equals neither.


/******** Equational Clauses **********/

	clause(app([],X))     equals X.
	clause(app([H|T],X))  equals [H|app(T,X)]. 

	clause(rev([]))       equals [].
	clause(rev([H|T]))    equals app(rev(T),[H]).

	clause(len([]))     equals 0.
	clause(len([H|T]))  equals succ(len(T)).

	clause(succ(X))     equals X+1.

	clause(size(phi))   equals 0.
	clause(size({X\T})) equals succ(size(T)).


/******** Subset Clauses ********/

	clause(perms(phi))     contains { {[]}              }.
	clause(perms({H\T}))   contains { distr(H,perms(T)) }.

	clause(distr(H,{L\_})) contains { {[H|L]}           }.

/******** Typical Goals Using the Meta-interpreter *********

reduce(app([1,2],[3,4])).
[1,2,3,4]

reduce(len([1,2,3,4])).
4

reduce(rev([1,2,3])).
[3,2,1]

reduce(perms({1,2,3})).
{[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,2,1],[3,1,2]}

************************/

