aboutsummaryrefslogtreecommitdiffstats
path: root/lib/constraint.mli
blob: c86ef89c6f6a7f15e931f4eec15476116afdd2e8 (plain) (blame)
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
91
type relation_name = string
type attr_name = string
type binding_expr = Var of attr_name | Const of Conventions.AbstractValue.t

module BindingMap : Map.S with type key = String.t

type binding = binding_expr BindingMap.t

type t =
  | MemberOf of { target : relation_name; binding : binding }
  | Not of { body : t; universe : relation_name }
  | And of t list
  | Or of t list
  | Exists of { variable : attr_name; quantifier : relation_name; body : t }
  | Forall of { variable : attr_name; quantifier : relation_name; body : t }

type diagnostic =
  | MembershipFailed of {
      target : string;
      bound_values : (attr_name * Conventions.AbstractValue.t) list;
    }
  | RelationNotFound of string
  | UnboundedQuantifier of { variable : attr_name; quantifier : relation_name }
  | ConstraintFailures of (string * diagnostic) list

val vars_in : t -> attr_name list
val rename_vars : (attr_name * attr_name) list -> t -> t
val filter_by_attrs : attr_name list -> t -> t option
val merge : (string * t) list -> (string * t) list -> (string * t) list
val member_of : target:relation_name -> binding:binding -> t
val not_ : universe:relation_name -> t -> t
val and_ : t list -> t
val or_ : t list -> t
val exists : variable:attr_name -> quantifier:relation_name -> t -> t
val forall : variable:attr_name -> quantifier:relation_name -> t -> t

type eval_context = {
  check_membership :
    relation_name -> (attr_name * Conventions.AbstractValue.t) list -> bool;
  iterate_finite :
    relation_name -> (attr_name * Conventions.AbstractValue.t) list list option;
}

val bind :
  binding ->
  Tuple.materialized ->
  (attr_name * Conventions.AbstractValue.t) list

val evaluate :
  eval_context -> Tuple.materialized -> t -> (bool, diagnostic) result

val evaluate_named :
  eval_context ->
  Tuple.materialized ->
  (string * t) list ->
  (bool, diagnostic) result

val evaluate_first_failure :
  eval_context ->
  Tuple.materialized ->
  (string * t) list ->
  (bool, diagnostic) result

type polarity = Positive | Negative | Both
type polarity_index

val polarity_of : ?neg:bool -> t -> polarity_index
val polarity_find : relation_name -> polarity_index -> polarity option

type timing = Immediate | Deferred

val focused_filter :
  t ->
  relation_name ->
  (attr_name * Conventions.AbstractValue.t) list ->
  (attr_name * Conventions.AbstractValue.t) list

val trigger_constants :
  t -> relation_name -> (attr_name * Conventions.AbstractValue.t) list

val substitute_transition :
  t -> relation_name -> (attr_name * Conventions.AbstractValue.t) list -> t

val make_comparison_binding : left:binding_expr -> right:binding_expr -> binding
val lt : left:binding_expr -> right:binding_expr -> t
val lte : left:binding_expr -> right:binding_expr -> t
val gt : left:binding_expr -> right:binding_expr -> t
val gte : left:binding_expr -> right:binding_expr -> t
val eq : left:binding_expr -> right:binding_expr -> t
val neq : left:binding_expr -> right:binding_expr -> t
val between : value:binding_expr -> low:binding_expr -> high:binding_expr -> t