पहले कुछ उबाऊ आयात:एग्डा में क्लॉज के साथ/पुनः लिखने वाले प्रकार, या, पदार्थ के बजाय पुनर्लेखन का उपयोग कैसे करें?
import Relation.Binary.PropositionalEquality as PE
import Relation.Binary.HeterogeneousEquality as HE
import Algebra
import Data.Nat
import Data.Nat.Properties
open PE
open HE using (_≅_)
open CommutativeSemiring commutativeSemiring using (+-commutativeMonoid)
open CommutativeMonoid +-commutativeMonoid using() renaming (comm to +-comm)
अब मान लीजिए कि मैं एक प्रकार से, कहते हैं, प्राकृतिक की सूचीबद्ध करा सकते हैं।
postulate Foo : ℕ -> Set
और मैं इस प्रकार के Foo
पर काम कार्यों के बारे में कुछ समानताओं को साबित करना चाहते हैं। चूंकि एग्डा बहुत स्मार्ट नहीं है, ये विषम समानताएं होंगी। एक साधारण उदाहरण
foo : (m n : ℕ) -> Foo (m + n) -> Foo (n + m)
foo m n x rewrite +-comm n m = x
bar : (m n : ℕ) (x : Foo (m + n)) -> foo m n x ≅ x
bar m n x = {! ?0 !}
पट्टी में लक्ष्य
Goal: (foo m n x | n + m | .Data.Nat.Properties.+-comm n m) ≅ x
————————————————————————————————————————————————————————————
x : Foo (m + n)
n : ℕ
m : ℕ
है होगा क्या इन |
के गोल में कर रहे हैं? और मैं इस प्रकार की अवधि का निर्माण कैसे शुरू करूं?
इस मामले में, मैं subst
के साथ मैन्युअल रूप से प्रतिस्थापन करके समस्या के आसपास काम कर सकता हूं, लेकिन यह बड़े प्रकार और समीकरणों के लिए वास्तव में बदसूरत और थकाऊ हो जाता है।
foo' : (m n : ℕ) -> Foo (m + n) -> Foo (n + m)
foo' m n x = PE.subst Foo (+-comm m n) x
bar' : (m n : ℕ) (x : Foo (m + n)) -> foo' m n x ≅ x
bar' m n x = HE.≡-subst-removable Foo (+-comm m n) x