Crap, and stuff.
This commit is contained in:
parent
53632fdbad
commit
97b564f877
|
|
@ -0,0 +1,93 @@
|
|||
|
||||
|
||||
combo(branch, [T, F, Expr|S], S, Ei, Eo) :-
|
||||
\+ Expr = true, \+ Expr = false,
|
||||
catch( % Try Expr and do one or the other,
|
||||
(Expr -> append(T, Ei, Eo) ; append(F, Ei, Eo)),
|
||||
_, % If Expr don't grok, try both branches.
|
||||
(append(T, Ei, Eo) ; append(F, Ei, Eo))
|
||||
).
|
||||
|
||||
combo(loop, [B, Expr|S], S, Ei, Eo) :-
|
||||
\+ Expr = true, \+ Expr = false,
|
||||
catch( % Try Expr and do one or the other,
|
||||
(Expr -> append(B, [B, loop|Ei], Eo) ; Ei=Eo),
|
||||
_, % If Expr don't grok, try both branches.
|
||||
(Ei=Eo ; append(B, [B, loop|Ei], Eo))
|
||||
).
|
||||
|
||||
/*
|
||||
|
||||
To handle comparision operators the possibility of exceptions due to
|
||||
insufficiently instantiated arguments must be handled. First try to make
|
||||
the comparison and set the result to a Boolean atom. If an exception
|
||||
happens just leave the comparison expression as the result and some other
|
||||
function or combinator will deal with it. Example:
|
||||
|
||||
func(>, [A, B|S], [C|S]) :- catch(
|
||||
(B > A -> C=true ; C=false),
|
||||
_,
|
||||
C=(B>A) % in case of error.
|
||||
).
|
||||
|
||||
To save on conceptual overhead I've defined a term_expansion/2 that sets
|
||||
up the func/3 for each op.
|
||||
*/
|
||||
|
||||
term_expansion(comparison_operator(X), (func(X, [A, B|S], [C|S]) :-
|
||||
F =.. [X, B, A], catch((F -> C=true ; C=false), _, C=F))).
|
||||
|
||||
% I don't use Prolog-compatible op symbols in all cases.
|
||||
term_expansion(comparison_operator(X, Y), (func(X, [A, B|S], [C|S]) :-
|
||||
F =.. [Y, B, A], catch((F -> C=true ; C=false), _, C=F))).
|
||||
|
||||
% Likewise for math operators, try to evaluate, otherwise use the
|
||||
% symbolic form.
|
||||
|
||||
term_expansion(math_operator(X), (func(X, [A, B|S], [C|S]) :-
|
||||
F =.. [X, B, A], catch(C is F, _, C=F))).
|
||||
|
||||
term_expansion(math_operator(X, Y), (func(X, [A, B|S], [C|S]) :-
|
||||
F =.. [Y, B, A], catch(C is F, _, C=F))).
|
||||
|
||||
|
||||
|
||||
% Symbolic math expressions are literals.
|
||||
literal(_+_).
|
||||
literal(_-_).
|
||||
literal(_*_).
|
||||
literal(_/_).
|
||||
literal(_ mod _).
|
||||
|
||||
% Symbolic comparisons are literals.
|
||||
literal(_>_).
|
||||
literal(_<_).
|
||||
literal(_>=_).
|
||||
literal(_=<_).
|
||||
literal(_=:=_).
|
||||
literal(_=\=_).
|
||||
|
||||
|
||||
|
||||
% Symbolic math. Compute the answer, or derivative, or whatever, later.
|
||||
math_operator(+).
|
||||
math_operator(-).
|
||||
math_operator(*).
|
||||
math_operator(/).
|
||||
math_operator(mod).
|
||||
|
||||
% Attempt to calculate the value of a symbolic math expression.
|
||||
func(calc, [A|S], [B|S]) :- B is A.
|
||||
|
||||
func(sqrt, [A|S], [sqrt(A)|S]).
|
||||
|
||||
|
||||
comparison_operator(>).
|
||||
comparison_operator(<).
|
||||
comparison_operator(>=).
|
||||
comparison_operator(<=, =<).
|
||||
comparison_operator(=, =:=).
|
||||
comparison_operator(<>, =\=).
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
% Apparently there's no good way to have multi-line string literals in
|
||||
% Prolog code. I could do something like this:
|
||||
|
||||
def(`-- 1 -`).
|
||||
def(`? dup bool`).
|
||||
def(`++ 1 +`).
|
||||
def(`anamorphism [pop []] swap [dip swons] genrec`).
|
||||
def(`app1 grba infrst`).
|
||||
def(`app2 [grba swap grba swap] dip [infrst] cons ii`).
|
||||
def(`app3 3 appN`).
|
||||
def(`appN [grabN] cons dip map disenstacken`).
|
||||
def(`at drop first`).
|
||||
def(`average [sum 1.0 *] [size] cleave /`).
|
||||
def(`b [i] dip i`).
|
||||
def(`binary unary popd`).
|
||||
def(`ccons cons cons`).
|
||||
def(`cleave fork popdd`).
|
||||
def(`clop cleave popdd`).
|
||||
def(`codireco cons dip rest cons`).
|
||||
def(`dinfrirst dip infrst`).
|
||||
def(`disenstacken ? [uncons ?] loop pop`).
|
||||
def(`down_to_zero [0 >] [dup --] while`).
|
||||
def(`drop [rest] times`).
|
||||
def(`dupd [dup] dip`).
|
||||
def(`dupdd [dup] dipd`).
|
||||
def(`dupdipd dup dipd`).
|
||||
def(`enstacken stack [clear] dip`).
|
||||
def(`flatten [] swap [concat] step`).
|
||||
def(`fork [i] app2`).
|
||||
def(`fourth rest third`).
|
||||
def(`gcd true [tuck mod dup 0 >] loop pop`).
|
||||
def(`grabN [] swap [cons] times`).
|
||||
def(`grba [stack popd] dip`).
|
||||
def(`hypot [sqr] ii + sqrt`).
|
||||
def(`ifte [nullary] dipd swap branch`).
|
||||
def(`ii [dip] dupdip i`).
|
||||
def(`infra swons swaack [i] dip swaack`).
|
||||
def(`infrst infra first`).
|
||||
def(`make_generator [codireco] ccons`).
|
||||
def(`neg 0 swap -`).
|
||||
def(`not [true] [false] branch`).
|
||||
def(`nullary [stack] dinfrirst`).
|
||||
def(`of swap at`).
|
||||
def(`pam [i] map`).
|
||||
def(`pm [+] [-] clop`).
|
||||
def(`popd [pop] dip`).
|
||||
def(`popdd [pop] dipd`).
|
||||
def(`popop pop pop`).
|
||||
def(`popopd [popop] dip`).
|
||||
def(`popopdd [popop] dipd`).
|
||||
def(`primrec [i] genrec`).
|
||||
def(`product 1 swap [*] step`).
|
||||
def(`quoted [unit] dip`).
|
||||
def(`range [0 <=] [1 - dup] anamorphism`).
|
||||
def(`range_to_zero unit [down_to_zero] infra`).
|
||||
def(`reverse [] swap shunt`).
|
||||
def(`rrest rest rest`).
|
||||
def(`run [] swap infra`).
|
||||
def(`second rest first`).
|
||||
def(`shift uncons [swons] dip`).
|
||||
def(`shunt [swons] step`).
|
||||
def(`size 0 swap [pop ++] step`).
|
||||
def(`split_at [drop] [take] clop`).
|
||||
def(`sqr dup *`).
|
||||
def(`step_zero 0 roll> step`).
|
||||
def(`sum 0 swap [+] step`).
|
||||
def(`swons swap cons`).
|
||||
def(`take [] rolldown [shift] times pop`).
|
||||
def(`ternary binary popd`).
|
||||
def(`third rest second`).
|
||||
def(`unary nullary popd`).
|
||||
def(`unit [] cons`).
|
||||
def(`unquoted [i] dip`).
|
||||
def(`unswons uncons swap`).
|
||||
def(`while swap [nullary] cons dup dipd concat loop`).
|
||||
def(`x dup i`).
|
||||
Loading…
Reference in New Issue