Странная цель » Некоторый 0 = истина`, сгенерированная в доказательстве

#coq

Вопрос:

Рассмотрим эту проблему с игрушечным Coq (CollaCoq):

 Require Import ssreflect ssrfun ssrbool.
Require Import Unicode.Utf8.

Definition optfun (n: nat) : option nat :=
    match n with
    | 0 => Some 0
    | _ => None
    end.

Definition boolfun (n: nat) : bool :=
    match n with
    | 0 => true
    | _ => false
    end.

Lemma lem : ∀ n, isSome (optfun n) = boolfun n.
Proof.
    intro. unfold optfun, boolfun. destruct n.
 

Моя цель здесь состояла в том, чтобы boolfun быть истинным всякий optfun раз, когда возвращается некоторое, и доказать это в лемме.

Однако после приведенных шагов доказательства текущая подцель такова Some 0 = true .

Я подумал, что подобное предложение не должно даже проверять тип, потому что я ожидал Some 0 бы, что оно будет типичным option nat и true будет типичным bool . Почему это происходит? Что-то не так с моим optfun , boolfun или lem ?

Ответ №1:

Если мы запустим Set Printing Coercions. , мы сможем увидеть все неявные принуждения в нашем выражении (по умолчанию Coq скрывает их). В нашем случае цель превращается в isSome (Some 0) , потому что SSReflect добавляет принуждение между option и bool . Запустив Set Coercion Paths option bool. , мы видим, что isSome само по себе является рассматриваемым принуждением (см. Эту часть стандартной библиотеки).