Types 如何在Agda中定义归纳定义类型的子公式?
我试图定义一个简单的谓词,以确定公式是否是一个给定形式的子公式,而不是一个简单的归纳定义语法。我遇到了一些可能很简单的问题 (i) 我更愿意使用具有给定类型a的参数化模块。在a具有可判定等式的意义上,如何导入a是集合的信息?如果无法做到这一点,有哪些变通办法?这就是为什么我选择了Nat (ii)是否为Types 如何在Agda中定义归纳定义类型的子公式?,types,agda,type-theory,decidable,Types,Agda,Type Theory,Decidable,我试图定义一个简单的谓词,以确定公式是否是一个给定形式的子公式,而不是一个简单的归纳定义语法。我遇到了一些可能很简单的问题 (i) 我更愿意使用具有给定类型a的参数化模块。在a具有可判定等式的意义上,如何导入a是集合的信息?如果无法做到这一点,有哪些变通办法?这就是为什么我选择了Nat (ii)是否为t1≡ (t2//t3)(和类似定义的)谓词isSubFormula处理相等子公式的正确方法?如果没有,还有什么方法可以轻松做到这一点?我还考虑过为equalFmla编写一个谓词,然后使用isSub
t1≡ (t2//t3)
(和类似定义的)谓词isSubFormula
处理相等子公式的正确方法?如果没有,还有什么方法可以轻松做到这一点?我还考虑过为equalFmla
编写一个谓词,然后使用isSubFormula生成一个全局子公式谓词⊎ equalFmla
但我不确定这是否干净
(iii)当I模式与第一行内部匹配时,为什么最后三行突出显示蓝色?我怎样才能解决这个问题
(iv)为什么{!Data.Nat_≟_ n1 n2!}
优化以下内容
module categorial1 (A : Set) where
open import Data.Nat using (ℕ)
open import Data.Empty
open import Data.Sum
open import Relation.Binary.PropositionalEquality
-- type symbols
data tSymb : Set where
-- base : A → tSymb
base : ℕ → tSymb
~ : tSymb → tSymb
_\\_ : tSymb → tSymb → tSymb
_//_ : tSymb → tSymb → tSymb
-- A needs a decideable notion of equality
isSubFormula : tSymb → tSymb → Set
-- isSubFormula y (base x) = {!!}
isSubFormula (base n1) (base n2) = {!Data.Nat._≟_ n1 n2 !}
isSubFormula (~ t1) (base x) = ⊥
isSubFormula (t1 \\ t2) (base x) = ⊥
isSubFormula (t1 // t2) (base x) = ⊥
isSubFormula t1 (~ t2) = t1 ≡ (~ t2) ⊎ isSubFormula t1 t2
isSubFormula t1 (t2 \\ t3) = t1 ≡ (t2 \\ t3) ⊎ isSubFormula t1 t2 ⊎ isSubFormula t1 t3
isSubFormula t1 (t2 // t3) = t1 ≡ (t2 // t3) ⊎ isSubFormula t1 t2 ⊎ isSubFormula t1 t3
这是很多不同的问题;如果您单独发布每个问题,堆栈溢出效果会更好 然而,以下是一些答案: (i) 我宁愿使用具有给定类型a的参数化模块 一个导入的信息是A是一个集合,从某种意义上说,A是一个集合 可判定的平等 您可以通过决策程序对模块进行参数化,例如:
open import Relation.Binary
open import Relation.Binary.PropositionalEquality
module categorical1 {A : Set} (_≟_ : Decidable (_≡_ {A = A})) where
请注意,我们导入了Relation.Binary
(对于可判定的)和R.B.propositionalquality
(对于_≡_代码>),因为我们模块的参数类型依赖于这些定义
(iii)当我匹配模式时,为什么最后三行突出显示蓝色
第一个的内部?我怎样才能解决这个问题
这是Agda警告您,这些子句在定义上不成立,因为它们依赖于前面的子句,这些子句与t1
不匹配
(iv)为什么{!Data.Nat。≟ n1 n2!}下面是什么
module categorial1 (A : Set) where
open import Data.Nat using (ℕ)
open import Data.Empty
open import Data.Sum
open import Relation.Binary.PropositionalEquality
-- type symbols
data tSymb : Set where
-- base : A → tSymb
base : ℕ → tSymb
~ : tSymb → tSymb
_\\_ : tSymb → tSymb → tSymb
_//_ : tSymb → tSymb → tSymb
-- A needs a decideable notion of equality
isSubFormula : tSymb → tSymb → Set
-- isSubFormula y (base x) = {!!}
isSubFormula (base n1) (base n2) = {!Data.Nat._≟_ n1 n2 !}
isSubFormula (~ t1) (base x) = ⊥
isSubFormula (t1 \\ t2) (base x) = ⊥
isSubFormula (t1 // t2) (base x) = ⊥
isSubFormula t1 (~ t2) = t1 ≡ (~ t2) ⊎ isSubFormula t1 t2
isSubFormula t1 (t2 \\ t3) = t1 ≡ (t2 \\ t3) ⊎ isSubFormula t1 t2 ⊎ isSubFormula t1 t3
isSubFormula t1 (t2 // t3) = t1 ≡ (t2 // t3) ⊎ isSubFormula t1 t2 ⊎ isSubFormula t1 t3
因为isSubFormula
返回一个Set
,但是n1≟ n2
返回一个Dec_≡_代码>
我认为在您的代码中,对于isSubFormula
应该是一个命题还是一个决策过程存在混淆。如果它返回一个集合
,则表示它是一个命题。您可以在没有可判定相等的情况下编写,因为没有什么可判定的--isSubFormula
-两个基值的一致性意味着它们相等:
isSubFormula : tSymb → tSymb → Set
isSubFormula (base n1) (base n2) = n1 ≡ n2
如果您想要一个决策过程,您可以通过编写isSubFormula:tSymb来“盲目地”执行→ 齐姆→ Bool
,或将发行公式
保留为命题,并编写dec子公式:可判定发行公式
另外请注意,如果您试图确定isSubFormula
,则只需要A
上的可判定等式,这样您就可以
module categorical1 (A : Set) where
...
isSubFormula : tSymb → tSymb → Set
decSubFormula : Decidable (_≡_ {A = A}) → Decidable isSubFormula
decSubFormula _≟A_ = ? -- You can use _≟A_ here to decide equality of A values