-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmicrokanren.ijs
executable file
·65 lines (65 loc) · 1.21 KB
/
microkanren.ijs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
var =: err`(1&$)@.(0&=@#@$ *. (1&= +. 4&=)@(3!:0))
varu =: 1&=@#@$ *. (1&= +. 4&=)@(3!:0)
walk =: 4 : 0
if. ''-:x
do. ''
elseif. (varu x) *. (x e. 0&{::y)
do. (0&{::(x i.~0&{::y){1&{::y) walk y
else. x
end.
)
exts =: 2 : 0
if. (varu u) *. y -: '';''
do. (u&, &.> {.y) , ((<v)&, &.> }.y)
elseif. varu u
do. (u&, &.> {.y) , (v&; &.> }.y)
end.
)
pairu =: 0&<@# *. 32&=@(3!:0)
unify =: 2 : 0
a =. u walk y
b =. v walk y
if. (varu a) *. (a-:b)
do. y
elseif. varu a
do. a exts b y
elseif. varu b
do. b exts a y
elseif. (pairu a) *. (pairu b)
do. (0&{::a) unify (0&{::b) ((}.a) unify (}.b) y)
elseif. a-:b
do. y
else. 0
end.
)
equ =: 2 : 0
s =. u unify v (0&{::y)
if. s ~: 0
do. <(s ; }.y)
else. ''
end.
)
call =: var@(1&{::)
fresh =: {.,{.@:(>:@:]&.>{:)
mplus =: 2 : 0
if. u-:''
do. v
elseif. (1&=@# *. 32&~:@(3!:0)@>) u NB.brittle!
do.<'(',((5!:5)<'v'),') mplus (',((5!:5)<'a'[a=.".@(0&{::) u),')'
else. ({.u),((}.u) mplus v)
end.
)
bind =: 2 : 0
if. u-:''
do. ''
elseif. (1&=@# *. 32&~:@(3!:0)@>) u NB.brittle!
do. <'(',((5!:5)<'a'[a=.".@(0&{::) u),') bind (',((5!:5)<'v'),')'
else. (v@(0&{::) u) mplus ((}.u) bind v)
end.
)
disj =: 2 : 0
(u y) mplus (v y)
)
conj =: 2 : 0
(u y) bind v
)