Things have kind of run away with me. I've been working in Prolog for the last month or so. I'm not yet sure how to bring it together with the Python code.
61 KiB
61 KiB
In [1]:
import sympy
from joy.joy import run
from joy.library import UnaryBuiltinWrapper
from joy.utils.pretty_print import TracePrinter
from joy.utils.stack import list_to_stack
from notebook_preamble import D, J, V, defineIn [2]:
sympy.init_printing()In [3]:
stack = list_to_stack(sympy.symbols('c a b'))In [4]:
viewer = TracePrinter()
try:
run('over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2', stack, D, viewer.viewer)
except Exception, e:
print e
viewer.print_()can't convert expression to float
b a c . over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2
b a c a . [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2
b a c a [[[neg] dupdip sqr 4] dipd * * - sqrt pm] . dip 2 * [/] cons app2
b a c . [[neg] dupdip sqr 4] dipd * * - sqrt pm a 2 * [/] cons app2
b a c [[neg] dupdip sqr 4] . dipd * * - sqrt pm a 2 * [/] cons app2
b . [neg] dupdip sqr 4 a c * * - sqrt pm a 2 * [/] cons app2
b [neg] . dupdip sqr 4 a c * * - sqrt pm a 2 * [/] cons app2
b . neg b sqr 4 a c * * - sqrt pm a 2 * [/] cons app2
-b . b sqr 4 a c * * - sqrt pm a 2 * [/] cons app2
-b b . sqr 4 a c * * - sqrt pm a 2 * [/] cons app2
-b b . dup mul 4 a c * * - sqrt pm a 2 * [/] cons app2
-b b b . mul 4 a c * * - sqrt pm a 2 * [/] cons app2
-b b**2 . 4 a c * * - sqrt pm a 2 * [/] cons app2
-b b**2 4 . a c * * - sqrt pm a 2 * [/] cons app2
-b b**2 4 a . c * * - sqrt pm a 2 * [/] cons app2
-b b**2 4 a c . * * - sqrt pm a 2 * [/] cons app2
-b b**2 4 a*c . * - sqrt pm a 2 * [/] cons app2
-b b**2 4*a*c . - sqrt pm a 2 * [/] cons app2
-b -4*a*c + b**2 . sqrt pm a 2 * [/] cons app2
In [5]:
S, E = viewer.history[-1]In [6]:
q = S[0]
qOut [6]:
In [7]:
sympy.sqrt(q)Out [7]:
In [8]:
D['sqrt'] = UnaryBuiltinWrapper(sympy.sqrt)In [9]:
(root1, (root2, _)) = run('over [[[neg] dupdip sqr 4] dipd * * - sqrt pm] dip 2 * [/] cons app2', stack, D)[0]In [10]:
root1Out [10]:
In [11]:
root2Out [11]:
In [12]:
def F(u, k):
z = 1
while k != 0:
if odd(k):
z = z * u
k = k / 2
u = u * u
return zIn [13]:
def F5(u):
z = 1 * u
u = u * u
u = u * u
z = z * u
return zIn [14]:
define('odd == 2 %')In [15]:
define('Ft == [over] dip *')In [16]:
define('Fb == [[sqr] dip 2 //] dip')In [17]:
define('Fw == [pop odd] [Ft] [] ifte Fb')In [18]:
define('F == 1 [pop] [Fw] while popopd')In [19]:
J('2 5 F')32
In [20]:
from joy.joy import joy
from joy.library import FunctionWrapper
from joy.parser import Symbol
from joy.utils.stack import concat
S_while = Symbol('while')
@FunctionWrapper
def while_(S, expression, dictionary):
'''[if] [body] while'''
(body, (if_, stack)) = S
if joy(stack, if_, dictionary)[0][0]:
expression = concat(body, (if_, (body, (S_while, expression))))
return stack, expression, dictionary
@FunctionWrapper
def ifte(stack, expression, dictionary):
'''[if] [then] [else] ifte'''
(else_, (then, (if_, stack))) = stack
if_res = joy(stack, if_, dictionary)[0][0]
quote = then if if_res else else_
expression = concat(quote, expression)
return (stack, expression, dictionary)
D['ifte'] = ifte
D['while'] = while_In [21]:
stack = list_to_stack([5, sympy.symbols('u')])
viewer = TracePrinter()
try:
(result, _) = run('F', stack, D, viewer.viewer)[0]
except Exception, e:
print e
viewer.print_() u 5 . F
u 5 . 1 [pop] [Fw] while popopd
u 5 1 . [pop] [Fw] while popopd
u 5 1 [pop] . [Fw] while popopd
u 5 1 [pop] [Fw] . while popopd
u 5 1 . Fw [pop] [Fw] while popopd
u 5 1 . [pop odd] [Ft] [] ifte Fb [pop] [Fw] while popopd
u 5 1 [pop odd] . [Ft] [] ifte Fb [pop] [Fw] while popopd
u 5 1 [pop odd] [Ft] . [] ifte Fb [pop] [Fw] while popopd
u 5 1 [pop odd] [Ft] [] . ifte Fb [pop] [Fw] while popopd
u 5 1 . Ft Fb [pop] [Fw] while popopd
u 5 1 . [over] dip * Fb [pop] [Fw] while popopd
u 5 1 [over] . dip * Fb [pop] [Fw] while popopd
u 5 . over 1 * Fb [pop] [Fw] while popopd
u 5 u . 1 * Fb [pop] [Fw] while popopd
u 5 u 1 . * Fb [pop] [Fw] while popopd
u 5 u . Fb [pop] [Fw] while popopd
u 5 u . [[sqr] dip 2 //] dip [pop] [Fw] while popopd
u 5 u [[sqr] dip 2 //] . dip [pop] [Fw] while popopd
u 5 . [sqr] dip 2 // u [pop] [Fw] while popopd
u 5 [sqr] . dip 2 // u [pop] [Fw] while popopd
u . sqr 5 2 // u [pop] [Fw] while popopd
u . dup mul 5 2 // u [pop] [Fw] while popopd
u u . mul 5 2 // u [pop] [Fw] while popopd
u**2 . 5 2 // u [pop] [Fw] while popopd
u**2 5 . 2 // u [pop] [Fw] while popopd
u**2 5 2 . // u [pop] [Fw] while popopd
u**2 2 . u [pop] [Fw] while popopd
u**2 2 u . [pop] [Fw] while popopd
u**2 2 u [pop] . [Fw] while popopd
u**2 2 u [pop] [Fw] . while popopd
u**2 2 u . Fw [pop] [Fw] while popopd
u**2 2 u . [pop odd] [Ft] [] ifte Fb [pop] [Fw] while popopd
u**2 2 u [pop odd] . [Ft] [] ifte Fb [pop] [Fw] while popopd
u**2 2 u [pop odd] [Ft] . [] ifte Fb [pop] [Fw] while popopd
u**2 2 u [pop odd] [Ft] [] . ifte Fb [pop] [Fw] while popopd
u**2 2 u . Fb [pop] [Fw] while popopd
u**2 2 u . [[sqr] dip 2 //] dip [pop] [Fw] while popopd
u**2 2 u [[sqr] dip 2 //] . dip [pop] [Fw] while popopd
u**2 2 . [sqr] dip 2 // u [pop] [Fw] while popopd
u**2 2 [sqr] . dip 2 // u [pop] [Fw] while popopd
u**2 . sqr 2 2 // u [pop] [Fw] while popopd
u**2 . dup mul 2 2 // u [pop] [Fw] while popopd
u**2 u**2 . mul 2 2 // u [pop] [Fw] while popopd
u**4 . 2 2 // u [pop] [Fw] while popopd
u**4 2 . 2 // u [pop] [Fw] while popopd
u**4 2 2 . // u [pop] [Fw] while popopd
u**4 1 . u [pop] [Fw] while popopd
u**4 1 u . [pop] [Fw] while popopd
u**4 1 u [pop] . [Fw] while popopd
u**4 1 u [pop] [Fw] . while popopd
u**4 1 u . Fw [pop] [Fw] while popopd
u**4 1 u . [pop odd] [Ft] [] ifte Fb [pop] [Fw] while popopd
u**4 1 u [pop odd] . [Ft] [] ifte Fb [pop] [Fw] while popopd
u**4 1 u [pop odd] [Ft] . [] ifte Fb [pop] [Fw] while popopd
u**4 1 u [pop odd] [Ft] [] . ifte Fb [pop] [Fw] while popopd
u**4 1 u . Ft Fb [pop] [Fw] while popopd
u**4 1 u . [over] dip * Fb [pop] [Fw] while popopd
u**4 1 u [over] . dip * Fb [pop] [Fw] while popopd
u**4 1 . over u * Fb [pop] [Fw] while popopd
u**4 1 u**4 . u * Fb [pop] [Fw] while popopd
u**4 1 u**4 u . * Fb [pop] [Fw] while popopd
u**4 1 u**5 . Fb [pop] [Fw] while popopd
u**4 1 u**5 . [[sqr] dip 2 //] dip [pop] [Fw] while popopd
u**4 1 u**5 [[sqr] dip 2 //] . dip [pop] [Fw] while popopd
u**4 1 . [sqr] dip 2 // u**5 [pop] [Fw] while popopd
u**4 1 [sqr] . dip 2 // u**5 [pop] [Fw] while popopd
u**4 . sqr 1 2 // u**5 [pop] [Fw] while popopd
u**4 . dup mul 1 2 // u**5 [pop] [Fw] while popopd
u**4 u**4 . mul 1 2 // u**5 [pop] [Fw] while popopd
u**8 . 1 2 // u**5 [pop] [Fw] while popopd
u**8 1 . 2 // u**5 [pop] [Fw] while popopd
u**8 1 2 . // u**5 [pop] [Fw] while popopd
u**8 0 . u**5 [pop] [Fw] while popopd
u**8 0 u**5 . [pop] [Fw] while popopd
u**8 0 u**5 [pop] . [Fw] while popopd
u**8 0 u**5 [pop] [Fw] . while popopd
u**8 0 u**5 . popopd
u**5 .
In [22]:
resultOut [22]:
In [23]:
stack = list_to_stack([sympy.symbols('u')])
viewer = TracePrinter()
try:
(result, _) = run('dup dup * dup * *', stack, D, viewer.viewer)[0]
except Exception, e:
print e
viewer.print_()
resultOut [23]:
u . dup dup * dup * *
u u . dup * dup * *
u u u . * dup * *
u u**2 . dup * *
u u**2 u**2 . * *
u u**4 . *
u**5 .
In [ ]:
In [24]:
def m(x, y): return x * y
print m(2, 3)6
In [25]:
def m(x): return lambda y: x * y
print m(2)(3)6
In [26]:
def m(x): return "lambda y: %(x)s * y" % locals()
print m(2)
print eval(m(2))(3)lambda y: 2 * y 6
In [27]:
def p(n, b): # original
return 1 if n == 0 else b * p(n - 1, b)
def p(n): # curried
return lambda b: 1 if n == 0 else b * p(n - 1, b)
def p(n): # quoted
return "lambda b: 1 if %(n)s == 0 else b * p(%(n)s - 1, b)" % locals()
print p(3)lambda b: 1 if 3 == 0 else b * p(3 - 1, b)
In [28]:
def p(n): # lambda lowered
return (
lambda b: 1
if n == 0 else
lambda b: b * p(n - 1, b)
)
def p(n): # lambda lowered quoted
return (
"lambda b: 1"
if n == 0 else
"lambda b: b * p(%(n)s - 1, b)" % locals()
)
print p(3)lambda b: b * p(3 - 1, b)
In [29]:
def p(n): # expression lifted
if n == 0:
return lambda b: 1
f = p(n - 1)
return lambda b: b * f(b)
print p(3)(2)8
In [30]:
def p(n): # quoted
if n == 0:
return "lambda b: 1"
f = p(n - 1)
return "lambda b: b * (%(f)s)(b)" % locals()
print p(3)
print eval(p(3))(2)lambda b: b * (lambda b: b * (lambda b: b * (lambda b: 1)(b))(b))(b) 8
In [31]:
define('p == [0 =] [pop [pop 1]] [--] [i [dupdip *] cons] genrec')In [32]:
J('3 p')[[[[pop 1] dupdip *] dupdip *] dupdip *]
In [33]:
V('2 [[[[pop 1] dupdip *] dupdip *] dupdip *] i') . 2 [[[[pop 1] dupdip *] dupdip *] dupdip *] i
2 . [[[[pop 1] dupdip *] dupdip *] dupdip *] i
2 [[[[pop 1] dupdip *] dupdip *] dupdip *] . i
2 . [[[pop 1] dupdip *] dupdip *] dupdip *
2 [[[pop 1] dupdip *] dupdip *] . dupdip *
2 . [[pop 1] dupdip *] dupdip * 2 *
2 [[pop 1] dupdip *] . dupdip * 2 *
2 . [pop 1] dupdip * 2 * 2 *
2 [pop 1] . dupdip * 2 * 2 *
2 . pop 1 2 * 2 * 2 *
. 1 2 * 2 * 2 *
1 . 2 * 2 * 2 *
1 2 . * 2 * 2 *
2 . 2 * 2 *
2 2 . * 2 *
4 . 2 *
4 2 . *
8 .
In [ ]:
stack = list_to_stack([sympy.symbols('u')])
(result, s) = run('p i', stack, D)[0]
resultIn [ ]:
def odd(n): return n % 2
def F(u, k):
z = 1
while k != 0:
if odd(k):
z = z * u
k = k / 2
u = u * u
return z
F(2, 5)In [ ]:
def F(k):
def _F(u, k=k):
z = 1
while k != 0:
if odd(k):
z = z * u
k = k / 2
u = u * u
return z
return _F
F(5)(2)In [ ]:
def F(k):
def _F(u, k=k):
if k == 0:
z = 1
else:
z = F(k / 2)(u)
z *= z
if odd(k):
z = z * u
return z
return _F
F(5)(2)In [ ]:
def F(k):
if k == 0:
z = lambda u: 1
else:
f = F(k / 2)
def z(u):
uu = f(u)
uu *= uu
return uu * u if odd(k) else uu
return z
F(5)(2)In [ ]:
def F(k):
if k == 0:
z = lambda u: 1
else:
f = F(k / 2)
if odd(k):
z = lambda u: (lambda fu, u: fu * fu * u)(f(u), u)
else:
z = lambda u: (lambda fu, u: fu * fu)(f(u), u)
return z
F(5)(2)In [ ]:
def F(k):
if k == 0:
z = "lambda u: 1"
else:
f = F(k / 2)
if odd(k):
z = "lambda u: (lambda fu, u: fu * fu * u)((%(f)s)(u), u)" % locals()
else:
z = "lambda u: (lambda fu, u: fu * fu)((%(f)s)(u), u)" % locals()
return z
source = F(5)
print source
eval(source)(2)In [ ]:
for n in range(4):
print F(n)In [ ]:
def F(k):
if k == 0:
z = "lambda u: 1"
elif k == 1:
z = "lambda u: u"
else:
f = F(k / 2)
if odd(k):
z = "lambda u: (lambda fu, u: fu * fu * u)((%(f)s)(u), u)" % locals()
else:
z = "lambda u: (lambda fu, u: fu * fu)((%(f)s)(u), u)" % locals()
return z
source = F(5)
print source
eval(source)(2)In [ ]:
for n in range(4):
print F(n)In [ ]:
def F(k):
if k == 0:
z = "lambda u: 1"
elif k == 1:
z = "lambda u: u"
else:
m = k / 2
if odd(k):
if m == 0:
z = "lambda u: 1"
elif m == 1:
z = "lambda u: u * u * u"
else:
z = "lambda u: (lambda fu, u: fu * fu * u)((%s)(u), u)" % F(m)
else:
if m == 0:
z = "lambda u: 1"
elif m == 1:
z = "lambda u: u * u"
else:
z = "lambda u: (lambda u: u * u)((%s)(u))" % F(m)
return z
source = F(5)
print source
eval(source)(2)In [ ]:
def F(k):
if k == 0:
z = "lambda u: 1"
elif k == 1:
z = "lambda u: u"
else:
m = k / 2
if m == 0:
z = "lambda u: 1"
elif odd(k):
if m == 1:
z = "lambda u: u * u * u"
else:
z = "lambda u: (lambda fu, u: fu * fu * u)((%s)(u), u)" % F(m)
else:
if m == 1:
z = "lambda u: u * u"
else:
z = "lambda u: (lambda u: u * u)((%s)(u))" % F(m)
return z
source = F(5)
print source
eval(source)(2)In [ ]:
for n in range(7):
source = F(n)
print n, '%2i' % eval(source)(2), sourceIn [ ]:
def hylomorphism(c, F, P, G):
'''Return a hylomorphism function H.'''
def H(a):
if P(a):
result = c
else:
b, aa = G(a)
result = F(b, H(aa))
return result
return HIn [ ]:
def hylomorphism(c):
return lambda F: lambda P: lambda G: lambda a: (
if P(a):
result = c
else:
b, aa = G(a)
result = F(b)(H(aa))
return result
)
In [ ]:
def hylomorphism(c):
def r(a):
def rr(P):
if P(a):
return lambda F: lambda G: c
return lambda F: lambda G: (
b, aa = G(a)
return F(b)(H(aa))
)
return rr
return r
In [ ]:
def hylomorphism(c):
def r(a):
def rr(P):
def rrr(G):
if P(a):
return lambda F: c
b, aa = G(a)
H = hylomorphism(c)(aa)(P)(G)
return lambda F: F(b)(H(F))
return rrr
return rr
return r
In [ ]:
def hylomorphism(c):
def r(a):
def rr(P):
def rrr(G):
if P(a):
return "lambda F: %s" % (c,)
b, aa = G(a)
H = hylomorphism(c)(aa)(P)(G)
return "lambda F: F(%(b)s)((%(H)s)(F))" % locals()
return rrr
return rr
return r
In [ ]:
hylomorphism(0)(3)(lambda n: n == 0)(lambda n: (n-1, n-1))In [ ]:
def F(a):
def _F(b):
print a, b
return a + b
return _F
In [ ]:
F(2)(3)In [ ]:
eval(hylomorphism(0)(5)(lambda n: n == 0)(lambda n: (n-1, n-1)))(F)In [ ]:
eval(hylomorphism([])(5)(lambda n: n == 0)(lambda n: (n-1, n-1)))(lambda a: lambda b: [a] + b)In [ ]:
In [ ]:
hylomorphism(0)([1, 2, 3])(lambda n: not n)(lambda n: (n[0], n[1:]))In [ ]:
hylomorphism([])([1, 2, 3])(lambda n: not n)(lambda n: (n[1:], n[1:]))In [ ]:
eval(hylomorphism([])([1, 2, 3])(lambda n: not n)(lambda n: (n[1:], n[1:])))(lambda a: lambda b: [a] + b)Warning:
Output truncated. This notebook contains too many cells to display efficiently.