Как можно использовать с проверять в Агде? - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь воспроизвести очень простое доказательство coq из основ программирования в agda, и мне сказали, что мне нужно использовать with inspect, чтобы доказать несоответствие из сопоставления с образцом для (bool) решающей способности строки с самим собой. Я получаю сообщение об ошибке ниже, и документация даже не дает правильную программу, используемую с with inspect. Почему этот вывод типа неверен и как я могу устранить свою ошибку?

module Maps where

open import Relation.Binary.PropositionalEquality using (_≡_; refl; cong; subst; trans; sym; inspect)
open import Data.String using (_++_; _==_; _≟_; String)
open import Data.Bool using (T; Bool; true; false; if_then_else_)

-- Coq-- Theorem eqb_string_refl : forall s : string, true = eqb_string s s.
eqbstringrefl' : (s : String) →  true ≡ (s == s)
eqbstringrefl' s with inspect (s == s) 
... | false with≡ eq = {!!}
... | true with≡ eq  = {!!}

(s == s) выделен красным и выдает следующую ошибку

Bool !=< (x : _A_70) → _B_71 x of type Set
when checking that the inferred type of an application
Bool
matches the expected type
(x : _A_70) → _B_71 x

Ответы [ 2 ]

3 голосов
/ 10 апреля 2020

Функция inspect в стандартной библиотеке имеет следующий тип:

inspect : ∀ {A : Set a} {B : A → Set b}
          (f : (x : A) → B x) (x : A) → Reveal f · x is f x

Как видите, она принимает два явных аргумента: функцию f и значение x. В руководстве пользователя есть раздел о том, как использовать идиому проверки, в частности, во втором примере, по сути, используется то же определение inspect, что и в стандартной библиотеке.

0 голосов
/ 20 апреля 2020

Стандартная библиотека имеет README, имеющую дело с идиомой inspect .

...