簡體   English   中英

如何在 Agda 中定義歸納定義類型的子公式?

[英]How to define a subformula of an inductively defined type in Agda?

我試圖定義一個簡單的謂詞來確定一個公式是否是一個給定形式的子公式,而不是一個簡單的歸納定義的語法。 我遇到了一些可能很簡單的問題。

(i) 我寧願使用具有給定類型 A 的參數化模塊。從 A 具有可判定相等的意義上說,如何導入 A 是集合的信息? 如果這無法完成,有哪些解決方法? 這就是為什么我用 Nat 代替。

(ii) t1 ≡ (t2 // t3) (和類似定義)謂詞isSubFormula是處理相等子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

這是很多不同的問題; 如果您單獨發布每個問題,堆棧溢出效果會更好。

盡管如此,這里有一些答案:

(i) 我寧願使用具有給定類型 A 的參數化模塊。從 A 具有可判定相等的意義上說,如何導入 A 是集合的信息?

您可以通過決策程序參數化您的模塊,即像這樣:

open import Relation.Binary
open import Relation.Binary.PropositionalEquality

module categorical1 {A : Set} (_≟_ : Decidable (_≡_ {A = A})) where

請注意,我們在模塊頭之前導入Relation.Binary (用於Decidable )和RBPropositionalEquality (用於_≡_ ),因為我們模塊的參數類型取決於這些定義。

(iii) 當我在第一行內部進行模式匹配時,為什么最后三行突出顯示藍色? 我怎樣才能解決這個問題

這是 Agda 警告您,這些子句在定義上不成立,因為它們依賴於與t1不匹配的先前子句。

(iv) 為什么 {!Data.Nat. n1 n2 !} 在下面細化?

因為isSubFormula返回一個Set ,但是n1 ≟ n2返回一個Dec _≡_

我認為您的代碼中關於isSubFormula應該是命題還是決策程序存在混淆。 如果它返回一個Set ,則意味着它是一個命題。 您可以在沒有可判定相等性的情況下編寫它,因為沒有什么可決定的——兩個base值的isSubFormula表示它們相等:

isSubFormula : tSymb → tSymb → Set
isSubFormula (base n1) (base n2) = n1 ≡ n2

如果你想要一個決策程序,你可以通過寫isSubFormula : tSymb → tSymb → Bool或者通過將isSubFormula作為一個命題並寫decSubFormula : Decidable isSubFormula來“盲目地”做到這decSubFormula : Decidable isSubFormula

另請注意,如果您嘗試確定isSubFormula ,則只需要AA可判定相等isSubFormula ,因此您可以這樣做

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM