------------------------------------------------------------------------------ -- Agda-Metis Library. -- Check module. -- -- * Description: -- -- Some inference rules are composition of other rules. -- Many of them work as follows: -- - rule₁,₂,₃ : from Γ⊢ϕ try to construct Γ⊢ψ, for some ϕ, ψ ∈ PropFormula. -- Then, we want to build a strong rule that compose other rules, and all rules -- including the new one follows the same principle described above. -- -- To compose in an efficient way, we propose the following algorithm: -- -- Step 0 : Sort the rules in a convenient order. -- Step 1 : Apply the first rule with Γ⊢ϕ and ψ and go to Step 3. -- Step 2 : Apply the next rule to Γ⊢ϕ, ψ ∈ PropFormula, -- Step 3 : If last step produces Γ⊢ψ, stop, else, -- go to Step 2 but instead of Γ⊢ϕ, we use Γ⊢last-rule(ϕ) and ψ. -- Step 4 : If there is more rules for applying go to Step 2. Otherwise stop. ------------------------------------------------------------------------------ open import Data.Nat using ( ℕ; suc; zero ) module ATP.Metis.Rules.Checking ( n : ℕ ) where ------------------------------------------------------------------------------ open import Data.Bool.Base using ( true; false ) open import Data.PropFormula.Dec n using ( ⌊_⌋ ) open import Data.PropFormula.Properties n using ( eq ) open import Data.PropFormula.Syntax n ------------------------------------------------------------------------------ -- Many functions in Agda-Metis follow the same pattern: -- from a source formula, they try to build a target formula. -- that's the reason, many functions are binary and not unary functions. -- This module aims to help composition of such functions in a fancy way. BinaryFunc : Set BinaryFunc = PropFormula → PropFormula → PropFormula data Check : (f : BinaryFunc) (x y : PropFormula) → Set where Stop : (f : BinaryFunc) → (x y : PropFormula) → Check f x y Continue : (f : BinaryFunc) → (x y : PropFormula) → Check f x y toCheck : (f : BinaryFunc) → (x : PropFormula) → (y : PropFormula) → Check f x y toCheck f x y with ⌊ eq (f x y) y ⌋ ... | true = Stop _ _ _ ... | false = Continue _ _ _ fromCheck : ∀ {g} {x y} (f : BinaryFunc) → Check g x y → PropFormula fromCheck f (Stop g x y) = g x y fromCheck f (Continue g x y) = f (g x y) y infixr 9 _●_ _●_ : (f : BinaryFunc) → (g : BinaryFunc) → (BinaryFunc) f ● g = λ x y → fromCheck f (toCheck g x y) infixr 9 _●⊢_ _●⊢_ : ∀ {Γ} {ϕ} {f g} → (rule₁ : ∀ {Γ} {ϕ} → Γ ⊢ ϕ → (ψ : PropFormula) → Γ ⊢ f ϕ ψ) → (rule₂ : ∀ {Γ} {ϕ} → Γ ⊢ ϕ → (ψ : PropFormula) → Γ ⊢ g ϕ ψ) → Γ ⊢ ϕ → (ψ : PropFormula) → Γ ⊢ (f ● g) ϕ ψ _●⊢_ {Γ}{ϕ}{f}{g} rule₁ rule₂ Γ⊢ϕ ψ with toCheck g ϕ ψ ... | Stop g₁ x .ψ = rule₂ Γ⊢ϕ ψ ... | Continue g₁ x .ψ = rule₁ (rule₂ Γ⊢ϕ ψ) ψ ------------------------------------------------------------------------------ -- Example {- f : BinaryFunc f x y = y postulate thm-f : ∀ {Γ} {ϕ} → Γ ⊢ ϕ → (ψ : PropFormula) → Γ ⊢ f ϕ ψ g : BinaryFunc g x y = y postulate thm-g : ∀ {Γ} {ϕ} → Γ ⊢ ϕ → (ψ : PropFormula) → Γ ⊢ g ϕ ψ h = f ● g thm-h : ∀ {Γ} {ϕ} → Γ ⊢ ϕ → (ψ : PropFormula) → Γ ⊢ h ϕ ψ thm-h = thm-f ●⊢ thm-g -} ------------------------------------------------------------------------------ -- Transform a unary function (or theorem) to a binary function (or theorem) -- f : X → X -- (↑f f) : X → X → Y -- For theorems, we use (↑t) function. infixl 3 ↑f_ ↑f_ : (PropFormula → PropFormula) → (PropFormula → PropFormula → PropFormula) ↑f f = λ x y → f x ↑t : ∀ {fun} → (∀ {Γ} {φ} → Γ ⊢ φ → Γ ⊢ fun φ) → (∀ {Γ} {φ} → Γ ⊢ φ → (ψ : PropFormula) → Γ ⊢ (↑f fun) φ ψ) ↑t rule = λ z ψ → rule z id : PropFormula → PropFormula id x = x id-lem : ∀ {Γ} {φ} → Γ ⊢ φ → Γ ⊢ id φ id-lem {Γ} {φ} Γ⊢φ = Γ⊢φ -- Then we can check for equality in each step of a chain of composition (●) of -- unary functions. -- Example {- f : PropFormula → PropFormula f x = x postulate thm-f : ∀ {Γ} {ϕ} → Γ ⊢ ϕ → Γ ⊢ f ϕ g : PropFormula → PropFormula → PropFormula g x y = y postulate thm-g : ∀ {Γ} {ϕ} → Γ ⊢ ϕ → (ψ : PropFormula) → Γ ⊢ g ϕ ψ -- h = f ● g -- This fails, the ● composition needs both binary functions. h = (↑f f) ● g thm-h : ∀ {Γ} {ϕ} → Γ ⊢ ϕ → (ψ : PropFormula) → Γ ⊢ h ϕ ψ thm-h = (↑t thm-f) ●⊢ thm-g -}