package codex

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file quadrivalent_Lattice.ml

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
(**************************************************************************)
(*  This file is part of the Codex semantics library.                     *)
(*                                                                        *)
(*  Copyright (C) 2013-2025                                               *)
(*    CEA (Commissariat à l'énergie atomique et aux énergies              *)
(*         alternatives)                                                  *)
(*                                                                        *)
(*  you can redistribute it and/or modify it under the terms of the GNU   *)
(*  Lesser General Public License as published by the Free Software       *)
(*  Foundation, version 2.1.                                              *)
(*                                                                        *)
(*  It is distributed in the hope that it will be useful,                 *)
(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *)
(*  GNU Lesser General Public License for more details.                   *)
(*                                                                        *)
(*  See the GNU Lesser General Public License version 2.1                 *)
(*  for more details (enclosed in the file LICENSE).                      *)
(*                                                                        *)
(**************************************************************************)

(* Standard abstraction for booleans; powerset of {true;false} *)

(* TODO: Should become Quadrivalent_Lattice. And should go into lattice? *)
type boolean = Boolean_standard.Quadrivalent.t = 
  | Bottom
  | True
  | False
  | Top

module BooleanDT = (struct
  type t = boolean
  let pretty fmt t =
    let string = match t with
      | Bottom -> "{}"
      | True -> "{true}"
      | False -> "{false}"
      | Top -> "{true;false}"
    in Format.fprintf fmt "%s" string

  let _equal = (==)

  let compare (a:boolean) (b:boolean) = Stdlib.compare a b
  let hash = function
    | Bottom -> 0
    | True -> 1
    | False -> 2
    | Top -> 3

end)

module Boolean_Lattice = struct
  include BooleanDT
  let bottom () = Bottom
  let boolean_bottom = bottom ()
  let is_bottom x = (x = Bottom)

  let top () = Top

  let singleton = function
    | true -> True
    | false -> False
  
  let truth_value x = x

  let of_bools ~may_be_false ~may_be_true =
    match (may_be_false,may_be_true) with
    | (false,false) -> Bottom
    | (false,true) -> True
    | (true,false) -> False
    | (true,true) -> Top

  (* Conversion to a couple (may_be_false,may_be_true) *)
  let to_bools = function
    | Bottom -> (false,false)
    | True -> (false,true)
    | False -> (true,false)
    | Top -> (true,true)

  let join a b = match (a,b) with
    | Bottom, x | x, Bottom -> x
    | False,False -> False
    | True, True -> True
    | True, False | False, True -> Top
    | Top, _ | _, Top -> Top

  let includes a b = match a,b with
    | Top,_ -> true
    | _, Bottom -> true
    | True,True | False,False -> true
    | _ -> false

  let widen ~previous b = join previous b

  let includes_or_widen ~previous b =
    if includes previous b then (true,b) else (false,join previous b)

  let inter a b = match (a,b) with
    | Bottom, _ | _, Bottom -> Bottom
    | Top, x | x, Top -> x
    | True, False | False, True -> Bottom
    | True, True -> True
    | False, False -> False
  ;;

end

let to_quadrivalent x = x

include Boolean_Lattice

let equal = (==)