This repository was archived by the owner on Jul 25, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnodes.ml
More file actions
58 lines (40 loc) · 1.42 KB
/
Copy pathnodes.ml
File metadata and controls
58 lines (40 loc) · 1.42 KB
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
open Prelude
module L = List
module Make(N:Node.T) = struct
type t = N.t list
let rec insert combine n = function
[] -> [n]
| n' :: ns -> (match combine n n' with
None -> n' :: (insert combine n ns)
| Some n'' -> n'' :: ns)
;;
let unique ns = L.fold_left (flip (insert N.combine)) ns []
let union ns ns' = L.fold_left (flip (insert N.combine)) ns ns'
let unique_subsumed ns = L.fold_left (flip (insert N.combine_subsumed)) ns []
let cps ns = unique [ n | n1 <- ns; n2 <- ns; n <- N.cps n1 n2 ]
let is_trivial = L.for_all N.is_trivial
let map f = L.map f
let normalize = map N.normalize
let flip = map N.flip
let terms = map N.rule
let of_rules ctx = map (N.of_rule ctx)
let unq_filter f = List.filter (f <.> N.terms) <.> Listx.unique
let reduce ns =
let nf = Rewriting.nf (terms ns) in
let rec red acc = function
| [] -> acc
| n :: ns ->
let l,r = N.rule n in
if Rewriting.nf (terms acc) l = l then red (n :: acc) ns
else red acc ns
in red [] (map (N.rule_map (fun (l,r) -> (l, nf r))) ns)
;;
let symmetric ns = L.rev_append ns (flip ns)
let sort_smaller_than t ns =
let small = L.filter (fun n -> Rule.size (N.rule n) < t) ns in
let sort_by f = L.sort (fun x y -> f x - f y) in
sort_by (Rule.size <.> N.rule) small
;;
let print ppf =
Format.fprintf ppf "@[<v 0> %a@]" (Formatx.print_list N.print "\n ")
end