Simon Forman
22b34aba05
Using partial deduction to inline literals, functions, and combinators.
2019-08-22 15:45:24 -07:00
Simon Forman
558f45bf47
minor cleanup
2019-08-20 22:00:27 -07:00
Simon Forman
6e646c012f
small func recognizes [] and [X].
2019-08-19 22:02:06 -07:00
Simon Forman
b59e70f96d
Rename bar to korf and some docs.
2019-08-18 16:59:31 -07:00
Simon Forman
26c2730273
minor cleanup
2019-08-18 12:17:37 -07:00
Simon Forman
7d44742317
reintroduce definition of fork; it doesn't shadow func(fork, ...).
2019-08-18 11:47:48 -07:00
Simon Forman
a5fb17cc48
read child output after local thun/3
2019-08-18 11:09:36 -07:00
Simon Forman
2057d9ee74
truly fork, sort of
2019-08-18 10:53:25 -07:00
Simon Forman
11fdc81409
minor cleanup
2019-08-13 11:58:31 -07:00
Simon Forman
8116b83086
Minor cleanup.
2019-08-13 11:51:41 -07:00
Simon Forman
bbc0f750bc
Move DCG stuff to own file.
2019-08-13 11:48:08 -07:00
Simon Forman
defedcbd12
Parse ints; move line/{1,2} to main.pl.
2019-08-13 11:29:49 -07:00
Simon Forman
3f19b2b210
Parse floating point numbers.
2019-08-13 11:24:28 -07:00
Simon Forman
4c78a31bd9
minor cleanup
2019-08-12 22:29:09 -07:00
Simon Forman
d22e6e86dc
minor cleanup
2019-08-12 21:59:19 -07:00
Simon Forman
86bf875841
Numbers can be followed by space or [.
2019-08-12 21:29:26 -07:00
Simon Forman
8947dff010
Parse negative numbers.
2019-08-12 21:13:11 -07:00
Simon Forman
143b711028
swapd function
2019-08-12 21:08:35 -07:00
Simon Forman
aae0e91c44
assert_defs/1 got upset about not finding combo/5
2019-08-12 21:08:17 -07:00
Simon Forman
e67ef3951c
Minor cleanup of the parser.
2019-08-12 20:59:02 -07:00
Simon Forman
120610cd6b
rework parser DCGs
2019-08-12 20:12:35 -07:00
Simon Forman
b25ef2d5f7
Oops! Regression.
2019-08-12 19:25:13 -07:00
Simon Forman
dd42c7c0bc
minor cleanup
2019-08-12 19:17:15 -07:00
Simon Forman
cae79ded8f
swoncat and fiddling with parser.
2019-08-12 19:09:49 -07:00
Simon Forman
2e1f598aa2
Experiment with putting logic vars on the stack.
2019-08-11 21:30:02 -07:00
Simon Forman
222c472449
Remove a cut that sucked.
2019-08-11 20:45:49 -07:00
Simon Forman
40148fced9
unstack, least_fraction
2019-08-11 19:57:28 -07:00
Simon Forman
7a4e58fe15
Copyright notices.
2019-08-11 19:41:11 -07:00
Simon Forman
afec650c7b
The sqrt/1 predicate wasn't working.
2019-08-11 19:35:05 -07:00
Simon Forman
79aa2f972d
Multifile func/3.
2019-08-11 18:45:57 -07:00
Simon Forman
cd60816429
Build math & comparision functions.
2019-08-11 17:48:29 -07:00
Simon Forman
ab454375c0
Clean up REPL formatting.
2019-08-11 17:00:38 -07:00
Simon Forman
4d33f32674
Don't shadow funcs and combos.
2019-08-11 15:12:56 -07:00
Simon Forman
adf0e96f84
Don't shadow funcs & combos.
2019-08-11 14:56:20 -07:00
Simon Forman
9e180e8173
Extract mainloop to own file.
2019-08-11 14:51:13 -07:00
Simon Forman
6bc1b5ec8b
Use double-quoted string for codes.
2019-08-10 22:21:57 -07:00
Simon Forman
f6705f3fa0
cleanup old files
2019-08-10 22:07:17 -07:00
Simon Forman
e49b0b70cb
Build defs.pl from defs.txt.
2019-08-10 22:03:44 -07:00
Simon Forman
90bccece6a
build defs.pl
2019-08-10 21:46:48 -07:00
Simon Forman
731c59088e
build defs.pl
2019-08-10 21:45:59 -07:00
Simon Forman
32e77f6d73
Move parser to own file.
2019-08-10 20:57:11 -07:00
Simon Forman
3af9e7e174
map combo
2019-08-10 20:42:48 -07:00
Simon Forman
c8c1df8d88
Bring in funcs and combos.
2019-08-10 20:12:41 -07:00
Simon Forman
ab587beaa9
Omit Prolog toplevel.
2019-08-10 20:06:12 -07:00
Simon Forman
dc5737eb45
Do not need thses files.
2019-08-10 20:03:52 -07:00
Simon Forman
1d31ca99c3
Fold in parser, main loop, and support.
2019-08-10 19:57:00 -07:00
Simon Forman
fd5f54992a
Rename foo to thun.
2019-08-10 19:25:48 -07:00
Simon Forman
1ce9544bcc
Make a version for GNU Prolog compiler.
2019-08-10 12:19:09 -07:00
Simon Forman
10a23c5c68
Also don't shadow combinators.
...
(I realized that the way defs are parsed now means that each def
(but the last) is first asserted with the wrong definition expression
(it includes the symbol of the following definition at the end) and
then the parser figures out that there's another defintion following
and re-asserts the correct expression. It would be nice to fix that
but it's kind of a PITA. I used to build a list of definitions and
then assert them all at the end. For now there aren't enough defs to
justify the extra work.
2019-08-09 16:58:34 -07:00
Simon Forman
cbf2af18e5
Prevent definitions from shadowing functions.
2019-08-09 16:53:40 -07:00
Simon Forman
49491bceef
Demo grow/shrink.
2019-08-09 16:37:33 -07:00
Simon Forman
b9ae00cecb
A few more functions.
...
reverse, shift, shunt, take, split_at
2019-08-09 07:26:37 -07:00
Simon Forman
712f0a0267
merge
2019-08-07 23:36:38 -07:00
Simon Forman
976b8302be
grow/shrink as DCGs.
2019-08-07 23:28:28 -07:00
Simon Forman
4ea77cf1be
Integer DCGs that work in both directions.
2019-08-07 11:40:49 -07:00
Simon Forman
0048ee212d
loop combinator handles ambiguity.
...
remove some old notes.
2019-08-04 09:28:01 -07:00
Simon Forman
177d6cd433
Experiment in formatting stacks for output.
...
Tracing, sort of...
2019-08-03 19:01:45 -07:00
Simon Forman
3b1a89d1c4
Minor refactor.
...
crbo/4 to to_fixed_point/3
2019-08-03 19:01:00 -07:00
Simon Forman
cb0078f3bc
Gnarly fun with metaprogramming.
2019-08-03 17:56:25 -07:00
Simon Forman
2ba9242b76
Comparisions are literals too.
...
Also a bunch of reformatting.
Maybe I can modify the term_expansion/2 to also write the literal/1 clauses for math and comps?
2019-07-22 10:25:34 -07:00
Simon Forman
97a99ac3c4
Bits of formatting.
2019-07-22 10:04:32 -07:00
Simon Forman
df94c8feed
Minor cleanup.
2019-07-21 18:48:11 -07:00
Simon Forman
66d8a3be47
Remove write_state/5.
2019-07-21 17:56:34 -07:00
Simon Forman
6818abb3ce
Build a list of the moves taken.
2019-07-21 17:55:19 -07:00
Simon Forman
523cb3913b
Refactor a bit.
2019-07-21 17:25:22 -07:00
Simon Forman
c1442945a6
Assert definitions as they are read.
...
Instead of building a list then asserting them all after parsing.
2019-07-21 14:13:48 -07:00
Simon Forman
482ac3023e
Messing with TLA+ in Prolog.
2019-07-21 11:50:27 -07:00
Simon Forman
32d5953f29
Implement map combinator.
2019-07-21 08:28:56 -07:00
Simon Forman
84a2de7790
Tiny edits. Almost nothing.
2019-07-21 07:32:20 -07:00
Simon Forman
1b5d1c0b82
Remove cuts from branch combinator.
2019-07-20 19:34:56 -07:00
Simon Forman
206f49598e
Add mod, gcd, and hypot; term_expansion for math ops.
2019-07-20 19:26:11 -07:00
Simon Forman
ae769d2341
Fold try_both_branches/4 into branch combo.
2019-07-20 17:36:58 -07:00
Simon Forman
230288c02c
Replace ? with plain ol' def/2.
...
As much fun as it was using ? as an operator, now that all the defs live in a text file you don't see it in the Prolog code anymore.
This way I get to use sweet sweet ASCII (except for the ? symbol in the copyright notice.)
2019-07-20 17:32:03 -07:00
Simon Forman
7354911d05
WTF error handler.
...
Made it check that the unknown term really isn't a literal, definition, function, or combinator.
2019-07-20 17:19:35 -07:00
Simon Forman
2a66e7fb47
If I comment out the WTF handler...
...
...then the branch combinator works as intended. (Although the constraint-based stuff was also cool, it would have captured information from the comparison.)
?- joy(`[32 >] [++] [--] ifte`, Si, So).
Si = [_6598|_6600],
So = [_6598+1|_6600] ;
Si = [_6598|_6600],
So = [_6598-1|_6600] ;
false.
?- sjc(hmm, `[32 >] [++] [--] ifte`).
func(hmm, [A|B], [A+1|B]).
true ;
func(hmm, [A|B], [A-1|B]).
true ;
false.
2019-07-20 16:57:19 -07:00
Simon Forman
714bf2cab6
Try to handle expressions in branch combinator.
...
If the expression isn't 'true' or 'false' atoms then we assume it's a comparison expression and try to check its truth value.
If this fails then it will try both branches, to allow for e.g. compilation. THis almost works, but there's a choice point or something that gets hit before it tries the false path,
?- joy(` [32 >] [++] [--] ifte`, Si, So).
Si = [_2076|_2078],
So = [_2076+1|_2078] ;
wtf? +
Si = [_2076|_2078],
So = [[+], 1, _2076|_2078] ;
Si = [_2076|_2078],
So = [_2076-1|_2078] ;
wtf? -
Si = [_2076|_2078],
So = [[-], 1, _2076|_2078] ;
wtf? branch
Si = [_2076|_2078],
So = [[branch], [++], [--], _2076>32, _2076|_2078] ;
wtf? swap
Si = [_2076|_2078],
So = [[swap, branch], [--], [++], _2076>32, _2076|_2078] ;
wtf? first
Si = [_2076|_2078],
So = [[first, [++], [--], swap, branch], [_2076>32|_2078], _2076|_2078]
etc...
2019-07-20 16:45:28 -07:00
Simon Forman
c676dce2f9
Handle exceptions in comparison ops.
...
You can't compare logic vars, so just bunt.
2019-07-20 16:38:48 -07:00
Simon Forman
47ae7b2328
More readable genrec.
...
Explicit quoting is slightly more overhead but worth it I think to show what's going on more clearly.
2019-07-16 09:53:48 -07:00
Simon Forman
efeaa7b8e1
A little helper function to see compiled expressions.
...
Example from ordered binary tree notebook:
?- sjc(tree_add_Ee, `pop swap rolldown rrest ccons`).
func(tree_add_Ee, [_, [_, _|C], A, B|D], [[A, B|C]|D]).
true .
2019-07-16 09:46:55 -07:00
Simon Forman
6d92b8801f
Clear out CLP(FD) functions.
...
I like them but then you are constrained (pun intended) to only using integers. I'll probably bring them back at some point, either as an alternate implementation or their own commands.
2019-07-16 08:59:24 -07:00
Simon Forman
731b49973c
Opps! Here's the implementation of bool.
2019-07-16 08:42:45 -07:00
Simon Forman
c4c6ece6d2
Add bool function to mimic Python semantics.
2019-07-16 08:41:28 -07:00
Simon Forman
06b81914eb
Change comparison ops to not use CLP(FD).
2019-07-15 23:02:08 -07:00
Simon Forman
84584a949c
Implement genrec combinator.
2019-07-15 20:55:41 -07:00
Simon Forman
2baf3b89ce
Minor cleanup of defs.
2019-07-15 20:55:11 -07:00
Simon Forman
9ebc64541a
Move all definitions to defs.txt.
2019-07-15 16:11:49 -07:00
Simon Forman
ee395e91f1
Retract previous definitions before asserting new ones.
2019-07-15 16:01:59 -07:00
Simon Forman
4fefc04da3
Load definitions from a file.
...
This paves the way to regularize the defs between Python and Prolog (and and future other) implementations.
2019-07-15 15:53:07 -07:00
Simon Forman
087c141c72
Parse joy definitions from text.
...
This way a definitions file can be shared between Python Joy and Prolog Joy.
2019-07-15 12:53:48 -07:00
Simon Forman
166355dccf
New combinator infrst == infra first
...
Three uses means it's time for a refactor.
2019-07-15 12:28:01 -07:00
Simon Forman
4ea1a5527e
nullary combinator as definition.
...
That eliminates all the recursive calls to thun/3 (outside of thun itself, which is tail recursive.) That means that this Joy interpreter is now fully CPS.
All state is contained in the stack and expression, nothing is hidden in the Prolog "call stack".
2019-07-15 11:20:13 -07:00
Simon Forman
d3313ce4a7
Infra as definition.
2019-07-14 23:02:10 -07:00
Simon Forman
9f1e75313b
Reimplement app1 and app2 as definitions.
...
This eliminates three recursive calls to thun/3.
2019-07-14 22:48:18 -07:00
Simon Forman
f227cf0a57
Got enough definitions, sort them.
2019-07-14 21:58:20 -07:00
Simon Forman
a90568e208
Switch to symbolic math (from CLP(FD).)
...
A wee bit of error reporting of unknown terms.
New functions: pm plus-or-minus and neg negate; new combinator dupdip.
2019-07-14 21:14:50 -07:00
Simon Forman
67f042cc57
See https://www.metalevel.at/acomip/
2019-05-06 12:47:30 -07:00
Simon Forman
0da935ed94
Minor cleanup.
2019-05-04 07:53:02 -07:00
Simon Forman
6c94313061
Change name from alpha to tmi.
2019-05-04 06:57:14 -07:00
Simon Forman
8ca86d3d35
A Tracing Meta-Interpreter for Thun
2019-05-03 15:21:29 -07:00
Simon Forman
a95c3cec69
Some docs, and a thing to print out the dictionary after compilation.
2019-05-03 15:21:06 -07:00