1
2
5 if isinstance(args[0], str):
6 if len(args) == 1:
7 self._var = args[0]
8 self._type = 'v'
9 else:
10 self._var = args[0]
11 self._term = args[1]
12 self._type = 'l'
13 else:
14 self._f = args[0]
15 self._arg = args[1]
16 self._type = 'f'
17
19 if self.__class__ is not other.__class__:
20 return False
21 elif self._type is not other._type:
22 return False
23 elif self._type == 'v':
24 return self._var == other._var
25 elif self._type == 'l':
26 return self._var == other._var and self._term.equals(other._term)
27 elif self._type == 'f':
28 return self._f.equals(other._f) and self._arg.equals(other._arg)
29
31 if self._type == 'v':
32 return set([self._var])
33 elif self._type == 'l':
34 return set([self._var]).union(self._term.variables())
35 elif self._type == 'f':
36 return self._f.variables().union(self._arg.variables())
37
39 if self._type == 'v':
40 return set([self._var])
41 elif self._type == 'l':
42 return self._term.free().difference(set([self._var]))
43 elif self._type == 'f':
44 return self._f.free().union(self._arg.free())
45
47 if self._type == 'v':
48 return set([self])
49 elif self._type == 'l':
50 return self._term.subterms().union([self])
51 elif self._type == 'f':
52 return self._f.subterms().union(self._arg.subterms()).union(set([self]))
53
54 - def replace(self, variable, expression):
55 if self._type == 'v':
56 if self._var == variable:
57 return expression
58 else:
59 return self
60 elif self._type == 'l':
61 return Lambda(self._var,\
62 self._term.replace(variable, expression))
63 elif self._type == 'f':
64 return Lambda(self._f.replace(variable, expression),\
65 self._arg.replace(variable, expression))
66
68 if self._type == 'v':
69 return self
70 elif self._type == 'l':
71 return Lambda(self._var, self._term.simplify())
72 elif self._type == 'f':
73 f = self._f.simplify()
74 arg = self._arg.simplify()
75 if f._type == 'l':
76 return f._term.replace(f._var, arg).simplify()
77 else:
78 return self
79
81 if self._type == 'v':
82 return '%s' % self._var
83 elif self._type == 'l':
84 if continuation:
85 prefix = ' '
86 else:
87 prefix = '\\'
88 if self._term._type == 'l':
89 return '%s%s%s' % (prefix, self._var, self._term.__str__(1))
90 else:
91 return '%s%s.%s' % (prefix, self._var, self._term)
92 elif self._type == 'f':
93 str_f = str(self._f)
94 if self._f._type == 'f':
95 str_f = str_f[1:-1]
96 return '(%s %s)' % (str_f, self._arg)
97
99 if self._type == 'v':
100 return "Lambda('%s')" % self._var
101 elif self._type == 'l':
102 return "Lambda('%s', '%s')" % (self._var, self._term)
103 elif self._type == 'f':
104 return "Lambda('%s', '%s')" % (self._f, self._arg)
105
107 """Return a sequence of test expressions."""
108 A = Lambda('a')
109 X = Lambda('x')
110 Y = Lambda('y')
111 Z = Lambda('z')
112 XA = Lambda(X, A)
113 XY = Lambda(X, Y)
114 XZ = Lambda(X, Z)
115 YZ = Lambda(Y, Z)
116 XYZ = Lambda(XY, Z)
117 xX = Lambda('x', X)
118 xyX = Lambda('x', Lambda('y', X))
119 xXY = Lambda('x', XY)
120 S = Lambda(xyX, A)
121 B = Lambda('x', Lambda('y', Lambda('z', Lambda(X, YZ))))
122 C = Lambda('x', Lambda('y', Lambda('z', Lambda(XZ, Y))))
123 O = Lambda('x', Lambda('y', XY))
124 N = Lambda(xX, A)
125 P = Lambda(Lambda('x', XA), xX)
126 return [N, P, S]
127
128 for expr in expressions():
129 print expr, "->", expr.simplify()
130