swh:1:snp:04e159a4411e97cbe416dcf21d082639f654120b
Tip revision: 6590f1e16484df765fdb915ed05e006511f40800 authored by MegiDervishi on 05 August 2019, 10:06:50 UTC
wdep
wdep
Tip revision: 6590f1e
Discrete.ec
(* --------------------------------------------------------------------
* Copyright (c) - 2012--2016 - IMDEA Software Institute
* Copyright (c) - 2012--2018 - Inria
* Copyright (c) - 2012--2018 - Ecole Polytechnique
*
* Distributed under the terms of the CeCILL-B-V1 license
* -------------------------------------------------------------------- *)
(* -------------------------------------------------------------------- *)
require import AllCore List.
(* -------------------------------------------------------------------- *)
pred enumerate ['a] (C : int -> 'a option) (E : 'a -> bool) =
(forall i j x, C i = Some x => C j = Some x => i = j)
/\ (forall x, E x => exists i, 0 <= i /\ C i = Some x).
(* -------------------------------------------------------------------- *)
pred countable ['a] (E : 'a -> bool) =
exists (C : int -> 'a option),
forall x, E x => exists i, C i = Some x.
(* -------------------------------------------------------------------- *)
lemma countableP ['a] (E : 'a -> bool):
countable E <=> exists (C : int -> 'a option), enumerate C E.
proof. admit. qed.
(* -------------------------------------------------------------------- *)
op cunion (C1 C2 : int -> 'a option) : (int -> 'a option).
(* -------------------------------------------------------------------- *)
op cunions (Cs : (int -> 'a option) list) =
foldr cunion (fun x => None) Cs.