2012-02-16 24 views
5

Tôi đang cố gắng để sử dụng bình đẳng heterogenous để chứng minh tuyên bố liên quan đến kiểu dữ liệu được lập chỉ mục này:tương đẳng cho bình đẳng heterogenous

data Counter : ℕ → Set where 
    cut : (i j : ℕ) → Counter (suc i + j) 

tôi đã có thể viết bằng chứng của tôi sử dụng Relation.Binary.HeterogenousEquality.≅-Lý luận, nhưng chỉ bằng cách giả sử các tài sản tương đẳng sau:

Counter-cong : ∀ {n n′} {k : Counter n} {k′ : Counter n′} → 
       {A : ℕ → Set} → (f : ∀{n} → Counter n → A n) → 
       k ≅ k′ → f k ≅ f k′ 
Counter-cong f k≅k′ = {!!} 

Tuy nhiên, tôi không thể mô hình phù hợp trên k≅k′refl mà không nhận được thông báo lỗi sau từ trình kiểm tra loại:

Refuse to solve heterogeneous constraint 
    k : Counter n =?= k′ : Counter n′ 

và nếu tôi cố gắng phân tích trường hợp theo số k≅k′ (tức là bằng cách sử dụng C-c C-c từ front-end Emacs) để đảm bảo tất cả các đối số ngầm được kết hợp đúng cách đối với những hạn chế của họ áp đặt bởi refl với, tôi nhận được

Cannot decide whether there should be a case for the constructor 
refl, since the unification gets stuck on unifying the 
inferred indices 
    [{.Level.zero}, {Counter n}, k] 
with the expected indices 
    [{.Level.zero}, {Counter n′}, k′] 

(nếu bạn quan tâm, đây là một số không phù hợp nền: Eliminating subst to prove equality)

+0

Để giải quyết sự cố, tôi hiện đang sử dụng loại được thay thế thay vì chỉ mục được lập chỉ mục: 'bộ đếm dữ liệu (n: ℕ): Đặt nơi cắt: (ij: ℕ) → (i + j + 1 = n: suc (i + j) ≡ n) → Số lượt truy cập n' – Cactus

Trả lời

5

những gì bạn có thể làm là lấy một bằng chứng thêm rằng hai chỉ số đều bình đẳng:

Counter-cong : ∀ {n n′} {k : Counter n} {k′ : Counter n′} → 
       {A : ℕ → Set} → (f : ∀{n} → Counter n → A n) → 
       n ≅ n′ → k ≅ k′ → f k ≅ f k′ 
Counter-cong f refl refl = refl 

vấn đề gốc được rằng biết Counter n ≅ Counter n′ doesn 't ngụ ý n ≡ n′ bởi vì các hàm tạo kiểu không được giả định là có tính tiêm (có một cờ --injective-type-constructors cho điều này, mà thực tế làm cho khớp đi qua, nhưng nó được biết là không nhất quán với loại trừ giữa), vì vậy trong khi nó có thể kết luận rằng hai loại bằng nhau, nó sẽ không viết lại n đến n′ và do đó bạn gặp lỗi đó khi kiểm tra sau nếu kk′ không thể xác định được.

Kể từ Counter n có chính xác n yếu tố, nó thực sự có thể để chứng minh Counter là đơn ánh sử dụng một cái gì đó giống như nguyên tắc chuồng bồ câu (và bình đẳng có thể decidable cho Naturals), do đó bạn có thể làm mà không có sự tranh luận n ≅ n′, dù rằng muốn được lộn xộn.

Chỉnh sửa: AFAICT the Het. hành vi bình đẳng vẫn như cũ.