From 7eb0e8e2fc193225da1076a2af7b28f2c85d80a5 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Wed, 20 Jul 2022 14:42:14 +0200 Subject: Add the opion monad file --- src/common/Optionmonad.v | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/common/Optionmonad.v diff --git a/src/common/Optionmonad.v b/src/common/Optionmonad.v new file mode 100644 index 0000000..14a41ef --- /dev/null +++ b/src/common/Optionmonad.v @@ -0,0 +1,66 @@ +(* + * Vericert: Verified high-level synthesis. + * Copyright (C) 2022 Yann Herklotz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *) + +From vericert Require Import Monad. +From Coq Require Import Lists.List. + +Module Option <: Monad. + + Definition mon := option. + + Definition ret {A: Type} (x: A) := Some x. + + Definition default {T : Type} (x : T) (u : option T) : T := + match u with + | Some y => y + | _ => x + end. + + Definition map {S : Type} {T : Type} (f : S -> T) (u : option S) : option T := + match u with + | Some y => Some (f y) + | _ => None + end. + + Definition liftA2 {T : Type} (f : T -> T -> T) (a : option T) (b : option T) : option T := + match a with + | Some x => map (f x) b + | _ => None + end. + + Definition bind {A B : Type} (f : option A) (g : A -> option B) : option B := + match f with + | Some a => g a + | _ => None + end. + + Definition bind2 {A B C : Type} (f : mon (A * B)) (g : A -> B -> option C) : option C := + match f with + | Some (a, b) => g a b + | _ => None + end. + + Definition join {A : Type} (a : option (option A)) : option A := + match a with + | None => None + | Some a' => a' + end. + +End Option. + +Module OptionExtra := MonadExtra(Option). -- cgit