Tenho a seguinte prova inacabada de um lema:
Goal forall (P : Type -> Prop) (Q : Prop),
((forall x, (P x)) -> Q) -> (exists x, P x -> Q).
Proof.
intros.
eapply ex_intro. intros. apply H. intros. eapply H0.
O problema é a última eapply
falha, com a mensagem
Error:
In environment
P : Type -> Prop
Q : Prop
H : (forall x : Type, P x) -> Q
H0 : P ?x
x : Type
Unable to unify "?x" with "x" (cannot instantiate "?x" because "x" is not in
its scope: available
arguments are "P" "Q" "H").
As etapas da prova já parecem muito fraudulentas. A prova constrói uma variável existencial para ficar no lugar de na segunda metade e, em seguida, tenta instanciar usando o obtido como premissa após a aplicação da hipótese . As etapas da prova parecem uma prova cíclica para mim.(forall x, (P x)) -> Q
O que em geral esta mensagem implica? Que tipos de erros lógicos essa mensagem indica aqui?
Há um problema recente no Github da Coq, na verdade, indica que instâncias instáveis fora do escopo PODEM provar falsidade, exceto pelo fato de serem bloqueadas pelo QED.
(P : Type -> Prop)
? E não(A : Type) (P : A -> Prop)
? Se você quis dizer o último, poderá provar a negação do seu lema .Respostas:
Quando você faz uma introdução existencial, você está dizendo que há algum termo , que é representado pela variável de unificação , de tal forma que . Em seguida, tenta aplicar a . Ele tenta generalizar , porque se puder mostrar que para uma constante nova (representada pela saída Coq), então seguirá. Ele tenta unificar essa constante nova , com a variável de unificação , mas isso não é permitido. De uma perspectiva lógica, representa um termot P( t ) → Q P( T ) H: ( ∀ x . P( x ) ) → Q P( C ) c ∀ x . P( X ) t e que prazo é, por definição frescura, distinto do fresco (ie ), que é só para dizer não estava no escopo quando introduzimos , então não pode ter dependesse disso.c c t t
?x
P ?x
x
x
?x
?x
x
Como um cenário mais simples, não podemos provar usando introdução existencial com . não está no escopo nesse ponto.∃ x . ∀ y. x = y y y
fonte