Đầu tiên một số hàng nhập khẩu nhàm chán:Các loại có chứa/viết lại mệnh đề trong agda, hoặc, cách sử dụng viết lại thay vì subst?
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)
Bây giờ giả sử rằng tôi có một loại được lập chỉ mục bởi, nói, bẩm sinh.
postulate Foo : ℕ -> Set
Và tôi muốn chứng minh một số điểm tương đồng về các chức năng hoạt động trên loại này Foo
. Bởi vì agda không phải là rất thông minh, đây sẽ là sự cân bằng không đồng nhất. Một ví dụ đơn giản sẽ là
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 !}
Mục đích trong thanh là
Goal: (foo m n x | n + m | .Data.Nat.Properties.+-comm n m) ≅ x
————————————————————————————————————————————————————————————
x : Foo (m + n)
n : ℕ
m : ℕ
được những |
s làm gì trong mục tiêu? Và làm thế nào để tôi bắt đầu xây dựng một thuật ngữ kiểu này?
Trong trường hợp này, tôi có thể giải quyết vấn đề bằng cách thay thế bằng cách thủ công với subst
, nhưng điều đó thực sự xấu xí và tẻ nhạt đối với các loại và phương trình lớn hơn.
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