liquid-fixpoint-0.2.3.2: external/fixpoint/ast.mli
(*
* Copyright © 2009 The Regents of the University of California. All rights reserved.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
* FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
*)
(**
* This module implements a DAG representation for expressions and
* predicates: each sub-predicate or sub-expression is paired with
* a unique int ID, which enables constant time hashing.
* However, one must take care when using DAGS:
* (1) they can only be constructed using the appropriate functions
* (2) when destructed via pattern-matching, one must discard the ID
*)
(*******************************************************)
(********************** Base Logic ********************)
(*******************************************************)
module Cone : sig
type 'a t = Empty | Cone of ('a * 'a t) list
val map : ('a -> 'b) -> 'a t -> 'b t
end
module Sort :
sig
type loc =
| Loc of string
| Lvar of int
| LFun
type tycon
type t
type sub
val tycon : string -> tycon
val tycon_string: tycon -> string
val to_string : t -> string
val print : Format.formatter -> t -> unit
val t_num : t
val t_frac : t
val t_obj : t
val t_bool : t
val t_int : t
val t_real : t
val t_generic : int -> t
val t_ptr : loc -> t
val t_func : int -> t list -> t
val t_app : tycon -> t list -> t
(* val t_fptr : t *)
val is_bool : t -> bool
val is_int : t -> bool
val is_real : t -> bool
val is_func : t -> bool
val is_kind : t -> bool
val app_of_t : t -> (tycon * t list) option
val func_of_t : t -> (int * t list * t) option
val ptr_of_t : t -> loc option
val compat : t -> t -> bool
val empty_sub : sub
val unifyWith : sub -> t list -> t list -> sub option
val unify : t list -> t list -> sub option
val apply : sub -> t -> t
val generalize : t list -> t list
val sub_args : sub -> (int * t) list
(* val check_arity : int -> sub -> bool *)
end
module Symbol :
sig
type t
module SMap : FixMisc.EMapType with type key = t
module SSet : FixMisc.ESetType with type elt = t
val mk_wild : unit -> t
val of_string : string -> t
val to_string : t -> string
val is_wild_any : t -> bool
val is_wild_fresh : t -> bool
val is_wild : t -> bool
val print : Format.formatter -> t -> unit
val value_variable : Sort.t -> t
val is_value_variable : t -> bool
val suffix : t -> string -> t
end
module Constant :
sig
type t = Int of int
| Real of float
| Lit of string * Sort.t
val to_string : t -> string
val print : Format.formatter -> t -> unit
end
type tag (* externally opaque *)
type brel = Eq | Ne | Gt | Ge | Lt | Le | Ueq | Une
type bop = Plus | Minus | Times | Div | Mod (* NOTE: For "Mod" 2nd expr should be a constant or a var *)
type expr = expr_int * tag
and expr_int =
| Con of Constant.t
| Var of Symbol.t
| App of Symbol.t * expr list
| Bin of expr * bop * expr
| Ite of pred * expr * expr
| Fld of Symbol.t * expr (* NOTE: Fld (s, e) == App ("field"^s,[e]) *)
| Cst of expr * Sort.t
| Bot
| MExp of expr list
| MBin of expr * bop list * expr
and pred = pred_int * tag
and pred_int =
| True
| False
| And of pred list
| Or of pred list
| Not of pred
| Imp of pred * pred
| Iff of pred * pred
| Bexp of expr
| Atom of expr * brel * expr
| MAtom of expr * brel list * expr
| Forall of ((Symbol.t * Sort.t) list) * pred
(* Constructors : expressions *)
val eTim : expr * expr -> expr
val eInt : int -> expr
val eCon : Constant.t -> expr
val eMExp : expr list -> expr
val eMod : expr * expr -> expr
val eModExp : expr * expr -> expr
val eVar : Symbol.t -> expr
val eApp : Symbol.t * expr list -> expr
val eBin : expr * bop * expr -> expr
val eMBin : expr * bop list * expr -> expr
val eIte : pred * expr * expr -> expr
val eFld : Symbol.t * expr -> expr
val eCst : expr * Sort.t -> expr
(* Constructors : predicates *)
val pTrue : pred
val pFalse : pred
val pAtom : expr * brel * expr -> pred
val pMAtom : expr * brel list * expr -> pred
val pAnd : pred list -> pred
val pOr : pred list -> pred
val pNot : pred -> pred
val pImp : (pred * pred) -> pred
val pIff : (pred * pred) -> pred
val pBexp : expr -> pred
val pForall: ((Symbol.t * Sort. t) list) * pred -> pred
val pEqual : expr * expr -> pred
val pUequal : expr * expr -> pred
val neg_brel : brel -> brel
module Expression :
sig
module Hash : Hashtbl.S with type key = expr
val print : Format.formatter -> expr -> unit
val show : expr -> unit
val to_string : expr -> string
val unwrap : expr -> expr_int
val support : expr -> Symbol.t list
val subst : expr -> Symbol.t -> expr -> expr
val map : (pred -> pred) -> (expr -> expr) -> expr -> expr
val iter : (pred -> unit) -> (expr -> unit) -> expr -> unit
end
module Predicate :
sig
module Hash : Hashtbl.S with type key = pred
val print : Format.formatter -> pred -> unit
val show : pred -> unit
val to_string : pred -> string
val unwrap : pred -> pred_int
val support : pred -> Symbol.t list
val subst : pred -> Symbol.t -> expr -> pred
val map : (pred -> pred) -> (expr -> expr) -> pred -> pred
val iter : (pred -> unit) -> (expr -> unit) -> pred -> unit
val is_contra : pred -> bool
val is_tauto : pred -> bool
end
module Subst :
sig
type t
val empty : t
val is_empty : t -> bool
val extend : t -> (Symbol.t * expr) -> t
val compose : t -> t -> t
val of_list : (Symbol.t * expr) list -> t
val simultaneous_of_list : (Symbol.t * expr) list -> t
val to_list : t -> (Symbol.t * expr) list
val print : Format.formatter -> t -> unit
val apply : t -> Symbol.t -> expr option
end
module Horn :
sig
type pr = string * string list
type gd = C of pred | K of pr
type t = pr * gd list
val print: Format.formatter -> t -> unit
val support: t -> string list
end
val print_stats : unit -> unit
val fixdiv : pred -> pred
val zero : expr
val one : expr
val bot : expr
val symm_pred : pred -> pred
val unify_pred : pred -> pred -> Subst.t option
val substs_expr : expr -> Subst.t -> expr
val substs_pred : pred -> Subst.t -> pred
val simplify_pred : pred -> pred
val conjuncts : pred -> pred list
val sortcheck_expr : (Sort.tycon -> bool) -> (Symbol.t -> Sort.t option) -> expr -> Sort.t option
val sortcheck_pred : (Sort.tycon -> bool) -> (Symbol.t -> Sort.t option) -> pred -> bool
val sortcheck_app : (Sort.tycon -> bool) -> (Symbol.t -> Sort.t option) -> Sort.t option -> Symbol.t -> expr list -> (Sort.sub * Sort.t) option
val into_of_expr : expr -> int option