-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path04_recursao.clc
90 lines (74 loc) · 1.79 KB
/
04_recursao.clc
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
typedefs
Bool = 1 + 1 ;
Nat = rec X : *ns. 1 + X ;
Cliente = rec X : *s . +{ !Nat.?Bool.X, End } ;
Servidor = rec X : *s . &{ ?Nat.!Bool.X, End }
end
let un false : Bool = inl [1] {} in
let un true : Bool = inr [1] {} in
let un discardBool : Bool -o 1 =
\lin b : Bool.
case b of
inl unit -> unit ;
inr unit -> unit
in
let un or : Bool -o Bool -o Bool =
\lin a : Bool.
\lin b : Bool.
case a of
inl unit ->
let {} = unit in
b ;
inr unit ->
let {} = unit in
let {} = discardBool b in
true
in
let un zero : Nat = fold [Nat] (inl [Nat] {}) in
let un succ : Nat -o Nat =
\lin n : Nat.
fold [Nat] (inr [1] n)
in
let rec discardNat : Nat -o 1 =
\lin n : Nat.
case unfold n of
inl u ->
u ;
inr m ->
discardNat m
in
let un isZero : Nat -o Bool =
\lin n : Nat.
case unfold n of
inl u ->
let {} = u in
true ;
inr m ->
let {} = discardNat m in
false
in
-------------------------------------------------------
let un cliente : Cliente -o Bool =
\lin c0 : Cliente.
let lin c1 = select left (unfold c0) in
let lin c2 = send zero c1 in
let {b0, c3} = receive c2 in
let lin c4 = select left (unfold c3) in
let lin c5 = send (succ zero) c4 in
let {b1, c6} = receive c5 in
let lin c7 = select right (unfold c6) in
let {} = close c7 in
or b0 b1
in
let rec servidor : Servidor -o 1 =
\lin s0 : Servidor.
branch (unfold s0) of
left s1 ->
let {n, s2} = receive s1 in
let lin s3 = send (isZero n) s2 in
servidor s3 ;
right s1 ->
close s1
in
let lin c = fork servidor in
cliente c