2012-09-19 30 views
12

Đầ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 

Trả lời

9

Những ống chỉ giảm được lơ lửng trong khi chờ kết quả của các biểu thức trong câu hỏi, và nó thường nắm để thực tế là bạn đã có một khối with có kết quả mà bạn cần biết để tiến hành. Điều này là do cấu trúc rewrite chỉ mở rộng thành một with của biểu thức được đề cập cùng với bất kỳ giá trị phụ trợ nào có thể cần để làm cho nó hoạt động, tiếp theo là một kết quả phù hợp trên refl.

Trong trường hợp này, nó chỉ có nghĩa là bạn cần phải giới thiệu các +-comm n m trong một with khối và mô hình phù hợp trên refl (và có thể bạn sẽ cần phải mang theo n + m vào phạm vi quá, vì nó gợi ý, vì vậy sự bình đẳng có cái gì nói về). Mô hình đánh giá Agda khá đơn giản và nếu bạn khớp mẫu trên thứ gì đó (ngoại trừ mẫu giả phù hợp trên bản ghi), mô hình sẽ không giảm cho đến khi bạn khớp mẫu trên cùng một thứ. Bạn thậm chí có thể có thể lấy đi bằng cách viết lại bằng biểu thức tương tự trong bằng chứng của bạn, vì nó chỉ làm những gì tôi vạch ra cho bạn.

Chính xác hơn, nếu bạn xác định:

f : ... 
f with a | b | c 
... | someDataConstructor | boundButNonConstructorVariable | someRecordConstructor = ... 

và sau đó bạn tham khảo f như một biểu thức, bạn sẽ nhận được các đường ống mà bạn quan sát cho biểu a chỉ, bởi vì nó phù hợp trên someDataConstructor, do đó, lúc ít nhất để có được f để giảm bạn sẽ cần phải giới thiệu a và sau đó khớp với số someDataConstructor từ đó. Mặt khác, bc, mặc dù chúng được giới thiệu giống với khối, không đánh giá tạm dừng, vì b không khớp mẫu và c 's someRecordConstructor được biết là tĩnh để trở thành nhà xây dựng duy nhất có thể vì đó là bản ghi gõ với eta.

Các vấn đề liên quan