$\alpha, \beta, \gamma \in \Sigma$ (label set)
value type (int, bool, list, ...)
polarity ($+$, $-$)
$(\alpha \times \beta \rightarrow N) \in \mathscr{R}$ (rule set)
type id =
| T
| F
| And
type agent = {
id : id;
ports : agent Array.t;
}
type agent =
| T
| F
| And of agent * agent
type agent =
| T
| F
| And of agent * agent
| NamePos of agent promise
| NameNeg of agent resolver
let new_name () =
let promise, resolver = make_future () in
NamePos promise, NameNeg resolver
let rec apply_rule a1 a2 =
match a1, a2 with
| T, And (r, b) -> b -><- r
| And (r, b), T -> b -><- r
| _, _ -> failwith "No rule"
and ( -><- ) a1 a2 =
run_async pool
(fun _ -> apply_rule a1 a2)
let rec apply_rule a1 a2 =
match a1, a2 with
| T, And (r, b)
| And (r, b), T -> b -><- r
| _, _ -> failwith "No rule"
and ( -><- ) a1 a2 =
run_async pool
(fun _ -> apply_rule a1 a2)
let rec apply_rule a1 a2 = match a1, a2 with
| T, And (r, b)
| And (r, b), T -> b -><- r
| F, And (r, _)
| And (r, _), F -> F -><- r
| NamePos v, a
| a, NamePos v -> await v -><- a
| NameNeg v, a
| a, NameNeg v -> resolve v a
| _, _ -> failwith "No rule"
type agent =
| Int of int
| IsEven of agent
| T
| F
| And of agent * agent
| NamePos of agent promise
| NameNeg of agent resolver
let rec apply_rule a1 a2 =
match a1, a2 with
...
| IsEven r, Int n
| Int n, IsEven r when n mod 2 = 0
-> T -><- r
| IsEven r, Int _
| Int _, IsEven r
-> F -><- r
...
type agent =
| Int of int
| IsEven of agent
| T
| F
| And of agent * agent
| NamePos of agent promise
| NameNeg of agent resolver
type _ agent =
| Int : int -> int agent
| IsEven : bool agent -> int agent
| T : bool agent
| F : bool agent
| And : bool agent * bool agent -> bool agent
| NamePos : 'a agent promise -> 'a agent
| NameNeg : 'a agent resolver -> 'a agent
type _ agent =
| Int : int -> int agent
| IsEven : bool agent -> int agent
| T : bool agent
| F : bool agent
| And : bool agent * bool agent -> bool agent
| NamePos : 'a agent promise -> 'a agent
| NameNeg : 'a agent resolver -> 'a agent
type _ agent =
| Int : int -> int agent
| IsEven : bool agent -> int agent
| T : bool agent
| F : bool agent
| And : bool agent * bool agent -> bool agent
| NamePos : 'a agent promise -> 'a agent
| NameNeg : 'a agent resolver -> 'a agent
type (_, _) agent =
| Int : int -> (int, pos) agent
| IsEven : (bool, neg) agent -> (int, neg) agent
| T : (bool, pos) agent
| F : (bool, pos) agent
| And : (bool, neg) agent * (bool, pos) agent
-> (bool, neg) agent
| NamePos : ('a, pos) agent promise -> ('a, pos) agent
| NameNeg : ('a, pos) agent resolver -> ('a, neg) agent
type pos = |
type neg = |
type (_, _) agent =
| Int : int -> (int, pos) agent
| IsEven : (bool, neg) agent -> (int, neg) agent
| T : (bool, pos) agent
| F : (bool, pos) agent
| And : (bool, neg) agent * (bool, pos) agent
-> (bool, neg) agent
| NamePos : ('a, pos) agent promise -> ('a, pos) agent
| NameNeg : ('a, pos) agent resolver -> ('a, neg) agent
let rec apply_rule :
type a. (a, pos) agent -> (a, neg) agent -> unit =
fun a1 a2 -> match a1, a2 with
| T, And (r, b) -> b -><- r
| F, And (r, _) -> F -><- r
| Int n, IsEven r when n mod 2 = 0 -> T -><- r
| Int _, IsEven r -> F -><- r
| T, If (r, t, _) -> t -><- r
| F, If (r, _, e) -> e -><- r
| NamePos v, a -> await v -><- a
| a, NameNeg v -> resolve v a
and ( -><- ) :
type a. (a, pos) agent -> (a, neg) agent -> unit =
fun a1 a2 -> run_async pool (fun _ -> apply_rule a1 a2)