lambda-calculus 2.2.3__py3-none-any.whl → 3.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lambda_calculus/__init__.py +1 -1
- lambda_calculus/terms/__init__.py +6 -4
- lambda_calculus/terms/abc.py +17 -0
- lambda_calculus/terms/arithmetic.py +8 -7
- lambda_calculus/terms/combinators.py +10 -9
- lambda_calculus/terms/logic.py +7 -6
- lambda_calculus/terms/pairs.py +6 -5
- lambda_calculus/visitors/normalisation.py +2 -2
- lambda_calculus/visitors/substitution/unsafe.py +3 -8
- lambda_calculus/visitors/walking.py +4 -1
- {lambda_calculus-2.2.3.dist-info → lambda_calculus-3.1.0.dist-info}/METADATA +7 -6
- lambda_calculus-3.1.0.dist-info/RECORD +20 -0
- {lambda_calculus-2.2.3.dist-info → lambda_calculus-3.1.0.dist-info}/WHEEL +1 -2
- lambda_calculus-2.2.3.dist-info/RECORD +0 -20
- lambda_calculus-2.2.3.dist-info/top_level.txt +0 -1
- {lambda_calculus-2.2.3.dist-info → lambda_calculus-3.1.0.dist-info/licenses}/LICENSE +0 -0
lambda_calculus/__init__.py
CHANGED
|
@@ -6,7 +6,7 @@ from __future__ import annotations
|
|
|
6
6
|
from abc import abstractmethod
|
|
7
7
|
from collections.abc import Sequence, Set, Iterable, Iterator
|
|
8
8
|
from dataclasses import dataclass
|
|
9
|
-
from typing import TypeVar
|
|
9
|
+
from typing import TypeVar, final
|
|
10
10
|
from .. import visitors
|
|
11
11
|
from ..errors import CollisionError
|
|
12
12
|
from ..visitors import walking
|
|
@@ -17,6 +17,7 @@ __all__ = (
|
|
|
17
17
|
"Variable",
|
|
18
18
|
"Abstraction",
|
|
19
19
|
"Application",
|
|
20
|
+
"abc",
|
|
20
21
|
"arithmetic",
|
|
21
22
|
"logic",
|
|
22
23
|
"pairs",
|
|
@@ -128,6 +129,7 @@ class Term(Iterable["Term[V]"]):
|
|
|
128
129
|
return not self.free_variables()
|
|
129
130
|
|
|
130
131
|
|
|
132
|
+
@final
|
|
131
133
|
@dataclass(unsafe_hash=True, slots=True)
|
|
132
134
|
class Variable(Term[V]):
|
|
133
135
|
"""
|
|
@@ -197,6 +199,7 @@ class Variable(Term[V]):
|
|
|
197
199
|
return visitor.visit_variable(self)
|
|
198
200
|
|
|
199
201
|
|
|
202
|
+
@final
|
|
200
203
|
@dataclass(unsafe_hash=True, slots=True)
|
|
201
204
|
class Abstraction(Term[V]):
|
|
202
205
|
"""
|
|
@@ -278,7 +281,7 @@ class Abstraction(Term[V]):
|
|
|
278
281
|
)
|
|
279
282
|
raise CollisionError("new variable would bind free variable in body", (new,))
|
|
280
283
|
|
|
281
|
-
def eta_reduction(self) -> Term[V]:
|
|
284
|
+
def eta_reduction(self) -> Term[V]:
|
|
282
285
|
"""
|
|
283
286
|
Remove a useless abstraction.
|
|
284
287
|
|
|
@@ -289,8 +292,6 @@ class Abstraction(Term[V]):
|
|
|
289
292
|
case Application(f, Variable(x)) if x == self.bound and x not in f.free_variables():
|
|
290
293
|
return f
|
|
291
294
|
case _:
|
|
292
|
-
# mypy detects missing returns
|
|
293
|
-
# because of https://github.com/python/mypy/issues/12534
|
|
294
295
|
raise ValueError("abstraction is not useless")
|
|
295
296
|
|
|
296
297
|
def accept(self, visitor: visitors.Visitor[T, V]) -> T:
|
|
@@ -316,6 +317,7 @@ class Abstraction(Term[V]):
|
|
|
316
317
|
)
|
|
317
318
|
|
|
318
319
|
|
|
320
|
+
@final
|
|
319
321
|
@dataclass(unsafe_hash=True, slots=True)
|
|
320
322
|
class Application(Term[V]):
|
|
321
323
|
"""
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/python3
|
|
2
|
+
|
|
3
|
+
"""Predefined Variables for all ASCII letters"""
|
|
4
|
+
|
|
5
|
+
from string import ascii_letters
|
|
6
|
+
from . import Variable
|
|
7
|
+
|
|
8
|
+
__all__ = tuple(ascii_letters)
|
|
9
|
+
|
|
10
|
+
# better IDE autocompletion
|
|
11
|
+
a, b, c, d, e, f, g, h, i, j = map(Variable, "abcdefghij")
|
|
12
|
+
k, l, m, n, o, p, q, r, s, t = map(Variable, "klmnopqrst")
|
|
13
|
+
u, v, w, x, y, z = map(Variable, "uvwxyz")
|
|
14
|
+
|
|
15
|
+
A, B, C, D, E, F, G, H, I, J = map(Variable, "ABCDEFGHIJ")
|
|
16
|
+
K, L, M, N, O, P, Q, R, S, T = map(Variable, "KLMNOPQRST")
|
|
17
|
+
U, V, W, X, Y, Z = map(Variable, "UVWXYZ")
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
"""Implementations of natural numbers and arithmetic operators"""
|
|
4
4
|
|
|
5
|
+
from typing import Final
|
|
5
6
|
from . import Term, Variable, Abstraction, Application
|
|
6
7
|
from .logic import TRUE, FALSE
|
|
7
8
|
|
|
@@ -16,13 +17,13 @@ __all__ = (
|
|
|
16
17
|
"number"
|
|
17
18
|
)
|
|
18
19
|
|
|
19
|
-
ISZERO = Variable("n").apply_to(FALSE.abstract("x"), TRUE).abstract("n")
|
|
20
|
+
ISZERO: Final = Variable("n").apply_to(FALSE.abstract("x"), TRUE).abstract("n")
|
|
20
21
|
"""
|
|
21
22
|
Term which evaluates to :const:`lambda_calculus.terms.logic.TRUE`
|
|
22
23
|
if its argument is zero, :const:`lambda_calculus.terms.logic.FALSE` otherwise
|
|
23
24
|
"""
|
|
24
25
|
|
|
25
|
-
SUCCESSOR = Abstraction.curried(
|
|
26
|
+
SUCCESSOR: Final = Abstraction.curried(
|
|
26
27
|
("n", "f", "x"),
|
|
27
28
|
Application(
|
|
28
29
|
Variable("f"),
|
|
@@ -36,7 +37,7 @@ SUCCESSOR = Abstraction.curried(
|
|
|
36
37
|
Term evaluating to its argument incremented by one.
|
|
37
38
|
"""
|
|
38
39
|
|
|
39
|
-
PREDECESSOR = Abstraction.curried(
|
|
40
|
+
PREDECESSOR: Final = Abstraction.curried(
|
|
40
41
|
("n", "f", "x"),
|
|
41
42
|
Application.with_arguments(
|
|
42
43
|
Variable("n"),
|
|
@@ -60,7 +61,7 @@ PREDECESSOR = Abstraction.curried(
|
|
|
60
61
|
Term ealuating to its argument decremented by one.
|
|
61
62
|
"""
|
|
62
63
|
|
|
63
|
-
ADD = Abstraction.curried(
|
|
64
|
+
ADD: Final = Abstraction.curried(
|
|
64
65
|
("m", "n", "f", "x"),
|
|
65
66
|
Application.with_arguments(
|
|
66
67
|
Variable("m"),
|
|
@@ -77,7 +78,7 @@ ADD = Abstraction.curried(
|
|
|
77
78
|
Term evaluating to the sum of its two arguments.
|
|
78
79
|
"""
|
|
79
80
|
|
|
80
|
-
SUBTRACT = Abstraction.curried(
|
|
81
|
+
SUBTRACT: Final = Abstraction.curried(
|
|
81
82
|
("m", "n"),
|
|
82
83
|
Application.with_arguments(
|
|
83
84
|
Variable("n"),
|
|
@@ -88,7 +89,7 @@ SUBTRACT = Abstraction.curried(
|
|
|
88
89
|
Term evaluating to the difference of its two arguments.
|
|
89
90
|
"""
|
|
90
91
|
|
|
91
|
-
MULTIPLY = Abstraction.curried(
|
|
92
|
+
MULTIPLY: Final = Abstraction.curried(
|
|
92
93
|
("m", "n", "f"),
|
|
93
94
|
Application(
|
|
94
95
|
Variable("m"),
|
|
@@ -102,7 +103,7 @@ MULTIPLY = Abstraction.curried(
|
|
|
102
103
|
Term evaluating to the product of its two arguments.
|
|
103
104
|
"""
|
|
104
105
|
|
|
105
|
-
POWER = Abstraction.curried(
|
|
106
|
+
POWER: Final = Abstraction.curried(
|
|
106
107
|
("b", "e"),
|
|
107
108
|
Application(
|
|
108
109
|
Variable("e"),
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
"""Common combinators"""
|
|
4
4
|
|
|
5
|
+
from typing import Final
|
|
5
6
|
from . import Variable, Application
|
|
6
7
|
|
|
7
8
|
__all__ = (
|
|
@@ -16,7 +17,7 @@ __all__ = (
|
|
|
16
17
|
"OMEGA"
|
|
17
18
|
)
|
|
18
19
|
|
|
19
|
-
Y = Application(
|
|
20
|
+
Y: Final = Application(
|
|
20
21
|
Variable("g").apply_to(
|
|
21
22
|
Variable("x").apply_to(Variable("x"))
|
|
22
23
|
).abstract("x"),
|
|
@@ -28,7 +29,7 @@ Y = Application(
|
|
|
28
29
|
Y combinator used to define recursive terms.
|
|
29
30
|
"""
|
|
30
31
|
|
|
31
|
-
S = Variable("x").apply_to(
|
|
32
|
+
S: Final = Variable("x").apply_to(
|
|
32
33
|
Variable("z"),
|
|
33
34
|
Variable("y").apply_to(Variable("z"))
|
|
34
35
|
).abstract("x", "y", "z")
|
|
@@ -36,24 +37,24 @@ S = Variable("x").apply_to(
|
|
|
36
37
|
S combinator of the SKI combinator calculus.
|
|
37
38
|
"""
|
|
38
39
|
|
|
39
|
-
K = Variable("x").abstract("x", "y")
|
|
40
|
+
K: Final = Variable("x").abstract("x", "y")
|
|
40
41
|
"""
|
|
41
42
|
K combinator of the SKI combinator calculus.
|
|
42
43
|
"""
|
|
43
44
|
|
|
44
|
-
I = Variable("x").abstract("x")
|
|
45
|
+
I: Final = Variable("x").abstract("x")
|
|
45
46
|
"""
|
|
46
47
|
I combinator of the SKI combinator calculus.
|
|
47
48
|
"""
|
|
48
49
|
|
|
49
|
-
B = Variable("x").apply_to(
|
|
50
|
+
B: Final = Variable("x").apply_to(
|
|
50
51
|
Variable("y").apply_to(Variable("z"))
|
|
51
52
|
).abstract("x", "y", "z")
|
|
52
53
|
"""
|
|
53
54
|
B combinator of the BCKW combinator calculus.
|
|
54
55
|
"""
|
|
55
56
|
|
|
56
|
-
C = Variable("x").apply_to(
|
|
57
|
+
C: Final = Variable("x").apply_to(
|
|
57
58
|
Variable("z"),
|
|
58
59
|
Variable("y")
|
|
59
60
|
).abstract("x", "y", "z")
|
|
@@ -61,7 +62,7 @@ C = Variable("x").apply_to(
|
|
|
61
62
|
C combinator of the BCKW combinator calculus.
|
|
62
63
|
"""
|
|
63
64
|
|
|
64
|
-
W = Variable("x").apply_to(
|
|
65
|
+
W: Final = Variable("x").apply_to(
|
|
65
66
|
Variable("y"),
|
|
66
67
|
Variable("y")
|
|
67
68
|
).abstract("x", "y")
|
|
@@ -69,14 +70,14 @@ W = Variable("x").apply_to(
|
|
|
69
70
|
W combinator of the BCKW combinator calculus.
|
|
70
71
|
"""
|
|
71
72
|
|
|
72
|
-
DELTA = Variable("x").apply_to(
|
|
73
|
+
DELTA: Final = Variable("x").apply_to(
|
|
73
74
|
Variable("x")
|
|
74
75
|
).abstract("x")
|
|
75
76
|
"""
|
|
76
77
|
Term applying its argument to itself.
|
|
77
78
|
"""
|
|
78
79
|
|
|
79
|
-
OMEGA = DELTA.apply_to(DELTA)
|
|
80
|
+
OMEGA: Final = DELTA.apply_to(DELTA)
|
|
80
81
|
"""
|
|
81
82
|
Smallest term with no beta normal form.
|
|
82
83
|
"""
|
lambda_calculus/terms/logic.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
"""Implementations of boolean values and logical operators"""
|
|
4
4
|
|
|
5
|
+
from typing import Final
|
|
5
6
|
from . import Variable, Abstraction, Application
|
|
6
7
|
|
|
7
8
|
__all__ = (
|
|
@@ -13,17 +14,17 @@ __all__ = (
|
|
|
13
14
|
"IF_THEN_ELSE"
|
|
14
15
|
)
|
|
15
16
|
|
|
16
|
-
TRUE = Abstraction.curried(("x", "y"), Variable("x"))
|
|
17
|
+
TRUE: Final = Abstraction.curried(("x", "y"), Variable("x"))
|
|
17
18
|
"""
|
|
18
19
|
Term representing True.
|
|
19
20
|
"""
|
|
20
21
|
|
|
21
|
-
FALSE = Abstraction.curried(("x", "y"), Variable("y"))
|
|
22
|
+
FALSE: Final = Abstraction.curried(("x", "y"), Variable("y"))
|
|
22
23
|
"""
|
|
23
24
|
Term representing False
|
|
24
25
|
"""
|
|
25
26
|
|
|
26
|
-
AND = Abstraction.curried(
|
|
27
|
+
AND: Final = Abstraction.curried(
|
|
27
28
|
("p", "q"),
|
|
28
29
|
Application.with_arguments(Variable("p"), (Variable("q"), Variable("p")))
|
|
29
30
|
)
|
|
@@ -31,7 +32,7 @@ AND = Abstraction.curried(
|
|
|
31
32
|
Term implementing logical conjunction between its two arguments.
|
|
32
33
|
"""
|
|
33
34
|
|
|
34
|
-
OR = Abstraction.curried(
|
|
35
|
+
OR: Final = Abstraction.curried(
|
|
35
36
|
("p", "q"),
|
|
36
37
|
Application.with_arguments(Variable("p"), (Variable("p"), Variable("q")))
|
|
37
38
|
)
|
|
@@ -39,12 +40,12 @@ OR = Abstraction.curried(
|
|
|
39
40
|
Term implementing logical disjunction between its two arguments.
|
|
40
41
|
"""
|
|
41
42
|
|
|
42
|
-
NOT = Abstraction("p", Application.with_arguments(Variable("p"), (FALSE, TRUE)))
|
|
43
|
+
NOT: Final = Abstraction("p", Application.with_arguments(Variable("p"), (FALSE, TRUE)))
|
|
43
44
|
"""
|
|
44
45
|
Term performing logical negation of its argument.
|
|
45
46
|
"""
|
|
46
47
|
|
|
47
|
-
IF_THEN_ELSE = Abstraction.curried(
|
|
48
|
+
IF_THEN_ELSE: Final = Abstraction.curried(
|
|
48
49
|
("p", "a", "b"),
|
|
49
50
|
Application.with_arguments(Variable("p"), (Variable("a"), Variable("b")))
|
|
50
51
|
)
|
lambda_calculus/terms/pairs.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
"""Implementation of pairs"""
|
|
4
4
|
|
|
5
|
+
from typing import Final
|
|
5
6
|
from . import Variable, Abstraction, Application
|
|
6
7
|
from .logic import TRUE, FALSE
|
|
7
8
|
|
|
@@ -13,7 +14,7 @@ __all__ = (
|
|
|
13
14
|
"NULL"
|
|
14
15
|
)
|
|
15
16
|
|
|
16
|
-
PAIR = Abstraction.curried(
|
|
17
|
+
PAIR: Final = Abstraction.curried(
|
|
17
18
|
("x", "y", "f"),
|
|
18
19
|
Application.with_arguments(
|
|
19
20
|
Variable("f"),
|
|
@@ -24,22 +25,22 @@ PAIR = Abstraction.curried(
|
|
|
24
25
|
Term evaluating to a ordered pair of its two arguments.
|
|
25
26
|
"""
|
|
26
27
|
|
|
27
|
-
FIRST = Abstraction("p", Application(Variable("p"), TRUE))
|
|
28
|
+
FIRST: Final = Abstraction("p", Application(Variable("p"), TRUE))
|
|
28
29
|
"""
|
|
29
30
|
Term evaluating to the first value in its argument.
|
|
30
31
|
"""
|
|
31
32
|
|
|
32
|
-
SECOND = Abstraction("p", Application(Variable("p"), FALSE))
|
|
33
|
+
SECOND: Final = Abstraction("p", Application(Variable("p"), FALSE))
|
|
33
34
|
"""
|
|
34
35
|
Term evaluating to the second value in its argument.
|
|
35
36
|
"""
|
|
36
37
|
|
|
37
|
-
NIL = Abstraction("x", TRUE)
|
|
38
|
+
NIL: Final = Abstraction("x", TRUE)
|
|
38
39
|
"""
|
|
39
40
|
Special Term encoding an empty pair.
|
|
40
41
|
"""
|
|
41
42
|
|
|
42
|
-
NULL = Abstraction(
|
|
43
|
+
NULL: Final = Abstraction(
|
|
43
44
|
"p",
|
|
44
45
|
Application(
|
|
45
46
|
Variable("p"),
|
|
@@ -46,7 +46,7 @@ class BetaNormalisingVisitor(Visitor[Iterator[Step], str]):
|
|
|
46
46
|
def skip_intermediate(self, term: terms.Term[str]) -> terms.Term[str]:
|
|
47
47
|
"""
|
|
48
48
|
Calculate the beta normal form directly.
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
:param term: term which should be transformed into ist beta normal form
|
|
51
51
|
:return: new term representing the beta normal form if it exists
|
|
52
52
|
"""
|
|
@@ -77,7 +77,7 @@ class BetaNormalisingVisitor(Visitor[Iterator[Step], str]):
|
|
|
77
77
|
def beta_reducation(self, abstraction: terms.Abstraction[str], argument: terms.Term[str]) -> Generator[Step, None, terms.Term[str]]:
|
|
78
78
|
"""
|
|
79
79
|
Perform beta reduction of an application.
|
|
80
|
-
|
|
80
|
+
|
|
81
81
|
:param abstraction: abstraction of the application
|
|
82
82
|
:param argument: argument of the application
|
|
83
83
|
:return: Generator yielding steps and returning the reduced term
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
"""Substitutions which dont check if the substitutions are valid"""
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
|
-
from collections.abc import Set
|
|
7
6
|
from typing import TypeVar, final
|
|
8
7
|
from ... import terms
|
|
9
8
|
from . import DeferrableSubstitution
|
|
@@ -28,18 +27,14 @@ class UnsafeSubstitution(DeferrableSubstitution[V]):
|
|
|
28
27
|
|
|
29
28
|
value: terms.Term[V]
|
|
30
29
|
|
|
31
|
-
free_variables: Set[V]
|
|
32
|
-
|
|
33
30
|
__slots__ = (
|
|
34
31
|
"variable",
|
|
35
|
-
"value"
|
|
36
|
-
"free_variables"
|
|
32
|
+
"value"
|
|
37
33
|
)
|
|
38
34
|
|
|
39
|
-
def __init__(self, variable: V, value: terms.Term[V]
|
|
35
|
+
def __init__(self, variable: V, value: terms.Term[V]) -> None:
|
|
40
36
|
self.variable = variable
|
|
41
37
|
self.value = value
|
|
42
|
-
self.free_variables = free_variables
|
|
43
38
|
|
|
44
39
|
@classmethod
|
|
45
40
|
def from_substitution(cls, variable: V, value: terms.Term[V]) -> UnsafeSubstitution[V]:
|
|
@@ -50,7 +45,7 @@ class UnsafeSubstitution(DeferrableSubstitution[V]):
|
|
|
50
45
|
:param value: value which should be substituted
|
|
51
46
|
:return: new instance
|
|
52
47
|
"""
|
|
53
|
-
return cls(variable, value
|
|
48
|
+
return cls(variable, value)
|
|
54
49
|
|
|
55
50
|
def visit_variable(self, variable: terms.Variable[V]) -> terms.Term[V]:
|
|
56
51
|
"""
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
from collections.abc import Iterator
|
|
7
|
-
from typing import TypeVar
|
|
7
|
+
from typing import TypeVar, final
|
|
8
8
|
from .. import terms
|
|
9
9
|
from . import BottomUpVisitor
|
|
10
10
|
|
|
@@ -15,6 +15,7 @@ __all__ = (
|
|
|
15
15
|
V = TypeVar("V")
|
|
16
16
|
|
|
17
17
|
|
|
18
|
+
@final
|
|
18
19
|
class DepthFirstVisitor(BottomUpVisitor[Iterator["terms.Term[V]"], V]):
|
|
19
20
|
"""
|
|
20
21
|
Visitor yielding subterms depth first
|
|
@@ -24,6 +25,8 @@ class DepthFirstVisitor(BottomUpVisitor[Iterator["terms.Term[V]"], V]):
|
|
|
24
25
|
V: represents the type of variables used in terms
|
|
25
26
|
"""
|
|
26
27
|
|
|
28
|
+
__slots__ = ()
|
|
29
|
+
|
|
27
30
|
def visit_variable(self, variable: terms.Variable[V]) -> Iterator[terms.Term[V]]:
|
|
28
31
|
"""
|
|
29
32
|
Visit a Variable term.
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
2
|
-
Name:
|
|
3
|
-
Version:
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: lambda_calculus
|
|
3
|
+
Version: 3.1.0
|
|
4
4
|
Summary: Implementation of the Lambda calculus
|
|
5
|
-
Author-email: Eric Niklas Wolf <eric_niklas.wolf@mailbox.tu-dresden.de>
|
|
6
5
|
Project-URL: Repository, https://github.com/Deric-W/lambda_calculus
|
|
7
6
|
Project-URL: Documentation, http://lambda-calculus.readthedocs.io/
|
|
8
7
|
Project-URL: Bugtracker, https://github.com/Deric-W/lambda_calculus/issues
|
|
8
|
+
Author-email: Eric Niklas Wolf <eric_niklas.wolf@mailbox.tu-dresden.de>
|
|
9
|
+
License-File: LICENSE
|
|
9
10
|
Classifier: Intended Audience :: Education
|
|
10
11
|
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
11
12
|
Classifier: Operating System :: OS Independent
|
|
@@ -15,10 +16,10 @@ Classifier: Topic :: Utilities
|
|
|
15
16
|
Classifier: Typing :: Typed
|
|
16
17
|
Requires-Python: >=3.10
|
|
17
18
|
Description-Content-Type: text/markdown
|
|
18
|
-
License-File: LICENSE
|
|
19
19
|
|
|
20
20
|
# lambda_calculus
|
|
21
21
|
|
|
22
|
+
[](https://github.com/pypa/hatch)
|
|
22
23
|

|
|
23
24
|
[](https://codecov.io/gh/Deric-W/lambda_calculus)
|
|
24
25
|
[](https://lambda-calculus.readthedocs.io/en/stable/?badge=stable)
|
|
@@ -111,4 +112,4 @@ assert BetaNormalisingVisitor().skip_intermediate(term) == Application.with_argu
|
|
|
111
112
|
Variable("+"),
|
|
112
113
|
(Variable("4"), Variable("3"))
|
|
113
114
|
)
|
|
114
|
-
```
|
|
115
|
+
```
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
lambda_calculus/__init__.py,sha256=4HEzc-fklHdsxdB5vQY8Goxpay2xomfhpIVG_EEY3y4,340
|
|
2
|
+
lambda_calculus/errors.py,sha256=WVoIbibq6Ey-nzr99fUdITneGBxR871xnvGKWWhG37E,1185
|
|
3
|
+
lambda_calculus/py.typed,sha256=rVxfNzv1aKmfThIlRztkUwWiKeYa4XTdtNMh3FV-dGM,25
|
|
4
|
+
lambda_calculus/terms/__init__.py,sha256=tHVY4J7MaDWqpkOrxgcIqYuKn38drbjIm2lPFdZjhrU,12440
|
|
5
|
+
lambda_calculus/terms/abc.py,sha256=PyJDArUZM4TzskF7LqPx6luG34ptUawYUChkBlM2az0,510
|
|
6
|
+
lambda_calculus/terms/arithmetic.py,sha256=0-vvpTvioTfVLiMNt1MazrO28eMZAxHZudzt0IUoel0,2934
|
|
7
|
+
lambda_calculus/terms/combinators.py,sha256=OXbOKIA1V-7UYpPsx8HW8vA0-07ZtV72-OjXWK8wZgQ,1525
|
|
8
|
+
lambda_calculus/terms/logic.py,sha256=40tunDbyjQlm6ENse3psuosfJEsp1jR5hZPrEEruisE,1246
|
|
9
|
+
lambda_calculus/terms/pairs.py,sha256=h1OwLxda7FVxQ0mDYuTVHbJ28WuZPQnus4mIzc8UCUc,1045
|
|
10
|
+
lambda_calculus/visitors/__init__.py,sha256=jQoqB86o5gBuVbIFaG_-Zhiyk39ttHWqScGn85zSNfU,5033
|
|
11
|
+
lambda_calculus/visitors/normalisation.py,sha256=EUFaA1xIssJVL7MDAK3IWuLEArk3HdVjSP2lKr9Dz-s,4471
|
|
12
|
+
lambda_calculus/visitors/walking.py,sha256=01QgvJ-zjhQCF2r7zJQB__49WekGiNEa55JuZoF5v0g,1889
|
|
13
|
+
lambda_calculus/visitors/substitution/__init__.py,sha256=hBAKMal-mhx4wL0m-TJUEK2ZNwKIvnIXfFgYkf058tk,4326
|
|
14
|
+
lambda_calculus/visitors/substitution/checked.py,sha256=ZP9lEFyEvNXlJPh6-wXoMC_IK_h3IoLdtjTa-N8DW7o,4445
|
|
15
|
+
lambda_calculus/visitors/substitution/renaming.py,sha256=4m-OEbOw8ibkUkF7rk-0vpf3WP_44gXjrgSCVE4lvDk,7707
|
|
16
|
+
lambda_calculus/visitors/substitution/unsafe.py,sha256=aholWL9aBuC_R4BuPRLZr6oodRKSFPrYvCHQZotkFTY,2419
|
|
17
|
+
lambda_calculus-3.1.0.dist-info/METADATA,sha256=Tk5GxJZlkZLwdZXIkQwTRwaq2z4fepsqzvnzfa_ve60,3790
|
|
18
|
+
lambda_calculus-3.1.0.dist-info/WHEEL,sha256=as-1oFTWSeWBgyzh0O_qF439xqBe6AbBgt4MfYe5zwY,87
|
|
19
|
+
lambda_calculus-3.1.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
20
|
+
lambda_calculus-3.1.0.dist-info/RECORD,,
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
lambda_calculus/__init__.py,sha256=AAZfBOYtqGWRwluKg5hnif-q3un0lT_01ZncU7P5e9g,340
|
|
2
|
-
lambda_calculus/errors.py,sha256=WVoIbibq6Ey-nzr99fUdITneGBxR871xnvGKWWhG37E,1185
|
|
3
|
-
lambda_calculus/py.typed,sha256=rVxfNzv1aKmfThIlRztkUwWiKeYa4XTdtNMh3FV-dGM,25
|
|
4
|
-
lambda_calculus/terms/__init__.py,sha256=QO2CUqvxDOOS_wGF0YYk7wj8LH85N6Ovgk-K0x631zY,12546
|
|
5
|
-
lambda_calculus/terms/arithmetic.py,sha256=wSAgtl58u5LimyD9s5FPIuCmjcvRdZXPE4wnDh59nT8,2860
|
|
6
|
-
lambda_calculus/terms/combinators.py,sha256=cjIeKxgaSLOgmozEIU_Umr5QqgQQ6o7IsGlROD-uY_U,1437
|
|
7
|
-
lambda_calculus/terms/logic.py,sha256=P397XB-Yjqc4kwjctbNzE1P1F6SCSkngCKAFkKrpT3U,1179
|
|
8
|
-
lambda_calculus/terms/pairs.py,sha256=azxo3jtbhh7cyRLa8QU6VF96GEb6IZWQ5gr1hO_IDeQ,985
|
|
9
|
-
lambda_calculus/visitors/__init__.py,sha256=jQoqB86o5gBuVbIFaG_-Zhiyk39ttHWqScGn85zSNfU,5033
|
|
10
|
-
lambda_calculus/visitors/normalisation.py,sha256=VWBbienaPH5B-vbs8T5Q7StElGmpgoJnVfvuizyVfgE,4487
|
|
11
|
-
lambda_calculus/visitors/walking.py,sha256=HjU7nTq1hMy0YWo95TjsyM6YNw2zvUWBeCX9EG2OfMk,1855
|
|
12
|
-
lambda_calculus/visitors/substitution/__init__.py,sha256=hBAKMal-mhx4wL0m-TJUEK2ZNwKIvnIXfFgYkf058tk,4326
|
|
13
|
-
lambda_calculus/visitors/substitution/checked.py,sha256=ZP9lEFyEvNXlJPh6-wXoMC_IK_h3IoLdtjTa-N8DW7o,4445
|
|
14
|
-
lambda_calculus/visitors/substitution/renaming.py,sha256=4m-OEbOw8ibkUkF7rk-0vpf3WP_44gXjrgSCVE4lvDk,7707
|
|
15
|
-
lambda_calculus/visitors/substitution/unsafe.py,sha256=CMAsi-Z-c0sO-Eu9iwQiJuCE0NcR0tsyUoS52jEvx5o,2598
|
|
16
|
-
lambda_calculus-2.2.3.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
17
|
-
lambda_calculus-2.2.3.dist-info/METADATA,sha256=3RC99zbDUYF1wVglrdkPmmSQva6zYDrWbunw4VZAUG0,3681
|
|
18
|
-
lambda_calculus-2.2.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
|
19
|
-
lambda_calculus-2.2.3.dist-info/top_level.txt,sha256=p_Qfc-yRgkY5j0TZmT15x86trbd0oCVEJyEsF3kHKTo,16
|
|
20
|
-
lambda_calculus-2.2.3.dist-info/RECORD,,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
lambda_calculus
|
|
File without changes
|