(************************************************************************) (* * The Rocq Prover / The Rocq Development Team *) (* v * Copyright INRIA, CNRS and contributors *) (* <O___,, * (see version control and CREDITS file for authors & dates) *) (* \VV/ **************************************************************) (* // * This file is distributed under the terms of the *) (* * GNU Lesser General Public License Version 2.1 *) (* * (see LICENSE file for the text of the license) *) (************************************************************************)
open Univ
type t =
| QEq of Sorts.Quality.t * Sorts.Quality.t
| QLeq of Sorts.Quality.t * Sorts.Quality.t
| ULe of Sorts.t * Sorts.t
| UEq of Sorts.t * Sorts.t
| ULub of Level.t * Level.t
| UWeak of Level.t * Level.t
let is_trivial = function
| QLeq (QConstant QProp, QConstant QType) -> true
| QLeq (a,b) | QEq (a, b) -> Sorts.Quality.equal a b
| ULe (u, v) | UEq (u, v) -> Sorts.equal u v
| ULub (u, v) | UWeak (u, v) -> Level.equal u v
let force = function
| QEq _ | QLeq _ | ULe _ | UEq _ | UWeak _ as cst -> cst
| ULub (u,v) -> UEq (Sorts.sort_of_univ @@ Universe.make u, Sorts.sort_of_univ @@ Universe.make v)
let check_eq_level g u v = UGraph.check_eq_level g u v
module Set = struct
module S = Set.Make( struct type nonrec t = t
let compare x y = match x, y with
| QEq (a, b), QEq (a', b') -> let i = Sorts.Quality.compare a a' in if i <> 0 then i else Sorts.Quality.compare b b'
| QLeq (a, b), QLeq (a', b') -> let i = Sorts.Quality.compare a a' in if i <> 0 then i else Sorts.Quality.compare b b'
| ULe (u, v), ULe (u', v') -> let i = Sorts.compare u u' in if Int.equal i 0 then Sorts.compare v v' else i
| UEq (u, v), UEq (u', v') -> let i = Sorts.compare u u' in if Int.equal i 0 then Sorts.compare v v' elseif Sorts.equal u v' && Sorts.equal v u'then 0 else i
| ULub (u, v), ULub (u', v') | UWeak (u, v), UWeak (u', v') -> let i = Level.compare u u' in if Int.equal i 0 then Level.compare v v' elseif Level.equal u v' && Level.equal v u'then 0 else i
| QEq _, _ -> -1
| _, QEq _ -> 1
| QLeq _, _ -> -1
| _, QLeq _ -> 1
| ULe _, _ -> -1
| _, ULe _ -> 1
| UEq _, _ -> -1
| _, UEq _ -> 1
| ULub _, _ -> -1
| _, ULub _ -> 1 end)
include S
let add cst s = if is_trivial cst then s else add cst s
let pr_one = letopen Pp in function
| QEq (a, b) -> Sorts.Quality.raw_pr a ++ str " = " ++ Sorts.Quality.raw_pr b
| QLeq (a, b) -> Sorts.Quality.raw_pr a ++ str " <= " ++ Sorts.Quality.raw_pr b
| ULe (u, v) -> Sorts.debug_print u ++ str " <= " ++ Sorts.debug_print v
| UEq (u, v) -> Sorts.debug_print u ++ str " = " ++ Sorts.debug_print v
| ULub (u, v) -> Level.raw_pr u ++ str " /\\ " ++ Level.raw_pr v
| UWeak (u, v) -> Level.raw_pr u ++ str " ~ " ++ Level.raw_pr v
let pr c = letopen Pp in
fold (fun cst pp_std ->
pp_std ++ pr_one cst ++ fnl ()) c (str "")
let equal x y =
x == y || equal x y
let force s = map force s end
type'a constraint_function = 'a -> 'a -> Set.t -> Set.t
let enforce_eq_instances_univs strict x y c = let mkU u = Sorts.sort_of_univ @@ Universe.make u in let mk u v = if strict then ULub (u, v) else UEq (mkU u, mkU v) in ifnot (UVars.eq_sizes (UVars.Instance.length x) (UVars.Instance.length y)) then
CErrors.anomaly Pp.(str "Invalid argument: enforce_eq_instances_univs called with"++
str " instances of different lengths."); let xq, xu = UVars.Instance.to_array x and yq, yu = UVars.Instance.to_array y in let c = CArray.fold_left2 (* TODO strict? *)
(fun c x y -> if Sorts.Quality.equal x y then c elseSet.add (QEq (x,y)) c)
c xq yq in let c = CArray.fold_left2
(fun c x y -> Set.add (mk x y) c)
c xu yu in
c
let enforce_eq_qualities qs qs' cstrs =
CArray.fold_left2 (fun c a b -> if Sorts.Quality.equal a b then c elseSet.add (QEq (a, b)) c)
cstrs qs qs'
let compare_cumulative_instances cv_pb variances u u' cstrs = let make u = Sorts.sort_of_univ @@ Univ.Universe.make u in let qs, us = UVars.Instance.to_array u and qs', us' = UVars.Instance.to_array u' in let cstrs = enforce_eq_qualities qs qs' cstrs in
CArray.fold_left3
(fun cstrs v u u' -> letopen UVars.Variance in match v with
| Irrelevant -> Set.add (UWeak (u,u')) cstrs
| Covariant ->
(match cv_pb with
| Conversion.CONV -> Set.add (UEq (make u, make u')) cstrs
| Conversion.CUMUL -> Set.add (ULe (make u, make u')) cstrs)
| Invariant -> Set.add (UEq (make u, make u')) cstrs)
cstrs variances us us'
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.