This PR migrates the ⌜p⌝ notation for embedding pure p : Prop into SPred σs to expand into a simple, first-order expression SPred.pure p that can be supported by e-matching in grind. Doing so deprives ⌜p⌝ notation of its idiom-bracket-like support for #selector and ‹Nat›ₛ syntax which is thus removed.
144 lines
3.5 KiB
Text
144 lines
3.5 KiB
Text
/-
|
||
Copyright (c) 2022 Lars König. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Lars König, Mario Carneiro, Sebastian Graf
|
||
-/
|
||
import Std.Do.SPred.Notation
|
||
|
||
open Std.Do
|
||
|
||
variable
|
||
(φ : Prop)
|
||
(P Q R : SPred [Nat,Char,Bool])
|
||
(Ψ : Nat → SPred [Nat, Char, Bool])
|
||
(Φ : Nat → Nat → SPred [Nat, Char, Bool])
|
||
|
||
/-- info: P ⊢ₛ Q : Prop -/
|
||
#guard_msgs in
|
||
#check P ⊢ₛ Q
|
||
|
||
/-- info: P ⊢ₛ Q : Prop -/
|
||
#guard_msgs in
|
||
#check P ⊢ₛ Q
|
||
|
||
/-- info: P ⊣⊢ₛ Q : Prop -/
|
||
#guard_msgs in
|
||
#check P ⊣⊢ₛ Q
|
||
|
||
|
||
/-- info: ⌜φ⌝ : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check (⌜φ⌝ : SPred [Nat,Char,Bool])
|
||
|
||
/-- info: spred(P ∧ Q) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(P ∧ Q)
|
||
|
||
/-- info: spred(P ∧ Q ∧ R) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(P ∧ (Q ∧ R))
|
||
|
||
/-- info: spred(P ∨ Q) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(P ∨ Q)
|
||
|
||
/-- info: spred(P ∨ Q ∨ R) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(P ∨ (Q ∨ R))
|
||
|
||
/-- info: spred(¬P) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(¬ P)
|
||
|
||
/-- info: spred(¬(P ∨ Q)) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(¬ (P ∨ Q))
|
||
|
||
|
||
/-- info: spred(P → Q) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(P → Q)
|
||
|
||
/-- info: spred(P → Q → R) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(P → (Q → R))
|
||
|
||
/-- info: spred(P ∧ Q → R) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred((P ∧ Q) → R)
|
||
|
||
/-- info: spred(P → Q ∧ R) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(P → (Q ∧ R))
|
||
|
||
|
||
/-- info: spred(P ↔ Q) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(P ↔ Q)
|
||
|
||
/-- info: spred(P ∧ Q ↔ Q ∧ P) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred((P ∧ Q) ↔ (Q ∧ P))
|
||
|
||
|
||
/-- info: ∀ (x : Nat), x = 0 : Prop -/
|
||
#guard_msgs in
|
||
#check ∀ (x : Nat), x = 0
|
||
|
||
/-- info: spred(∀ x, Ψ x) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(∀ x, Ψ x)
|
||
|
||
/-- info: spred(∀ x, Ψ x) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(∀ (x : Nat), Ψ x)
|
||
|
||
/-- info: spred(∀ x, ∀ y, Φ x y) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(∀ x y, Φ x y)
|
||
|
||
/-- info: spred(∀ x, ∀ y, Φ x y) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(∀ (x : Nat) (y : Nat), Φ x y)
|
||
|
||
/-- info: spred(∀ x, ∀ y, Φ x y) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(∀ (x y : Nat), Φ x y)
|
||
|
||
|
||
/-- info: spred(∃ x, Ψ x) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(∃ x, Ψ x)
|
||
|
||
/-- info: spred(∃ x, Ψ x) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(∃ (x : Nat), Ψ x)
|
||
|
||
/-- info: spred(∃ x, ∃ y, Φ x y) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(∃ x y, Φ x y)
|
||
|
||
/-- info: spred(∃ x, ∃ y, Φ x y) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(∃ (x : Nat) (y : Nat), Φ x y)
|
||
|
||
/-- info: spred(∃ x, ∃ y, Φ x y) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(∃ (x y : Nat), Φ x y)
|
||
|
||
|
||
/--
|
||
info: if true = true then
|
||
match (1, 2) with
|
||
| (x, y) => Φ x y
|
||
else ⌜False⌝ : SPred [Nat, Char, Bool]
|
||
-/
|
||
#guard_msgs in
|
||
#check spred(if true then term(match (1,2) with | (x,y) => Φ x y) else ⌜False⌝)
|
||
|
||
/-- info: Ψ (1 + 1) : SPred [Nat, Char, Bool] -/
|
||
#guard_msgs in
|
||
#check spred(Ψ (1 + 1))
|
||
|
||
example (P Q : SPred [Nat, Bool]): SPred [Char, Nat, Bool] :=
|
||
spred(fun _ => ((∀ y, if y = 4 then (fun theNat => ⌜y = theNat⌝) ∧ P else Q) ∧ Q) → (∃ x, P → if (x : Bool) then Q else P))
|