aboutsummaryrefslogblamecommitdiffstats
path: root/lib/constraint.mli
blob: c86ef89c6f6a7f15e931f4eec15476116afdd2e8 (plain) (tree)


























































































                                                                                
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