types - 如何在 Agda 中定义归纳定义类型的子公式?
问题描述
我试图定义一个简单的谓词来确定一个公式是否是一个给定形式的子公式,而不是一个简单的归纳定义的语法。我遇到了一些可能很简单的问题。
(i) 我宁愿使用具有给定类型 A 的参数化模块。在 A 具有可判定相等性的意义上,如何导入 A 是一个集合的信息?如果无法做到这一点,有什么解决方法?这就是我使用 Nat 的原因。
(ii)t1 ≡ (t2 // t3)
谓词(并且定义类似)isSubFormula
是处理相等子公式的正确方法吗?如果没有,还有什么方法可以轻松做到这一点?我也考虑过编写一个谓词equalFmla
,然后用它制作一个全局子公式谓词,isSubFormula ⊎ equalFmla
但我不确定这是否如此干净。
(iii) 当我在第一行内部进行模式匹配时,为什么最后三行会突出显示蓝色?我怎样才能解决这个问题
(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
解决方案
推荐阅读
- flutter - 如何访问 Firestore 文档的元素
- javascript - 为什么节点提取在javascript中不起作用(节点提取)
- javafx - JavaFX 使 WebView 的行为类似于 VBox 中的标签
- javascript - 每月供款计算的复利不会产生正确的结果
- laravel - Vue-Laravel:使用 npm 导入已安装的模块不起作用
- javascript - next.js getInitialProps 在移动浏览器上不起作用
- angular - Angular Reactive Forms - 在提交时排除空值
- laravel - laravel如何使用switch在数据表中使用查询进行多重过滤
- docker - AWS ECS - 如果运行状况检查失败,如何重新启动/终止任务?
- javascript - 如何与 Selenium 的 Ant Design 日历交互?