Просто используйте setoid_rewrite
вместо rewrite
и убедитесь, что Require Setoid.
(хотя загрузка List
уже сделала это в этом случае).
Шаблон, который ищет Coq, находится подСвязующее;то есть он находится в теле функции.Связующее не очевидно, потому что оно является частью exists
, но ваша цель на самом деле ex (fun (x0:A) => f x0 = y /\ (x = x0 \/ In x0 xs))
, и механизм обозначений Coq хорошо печатает его как exists x0, ...
.Базовая тактика rewrite
не может переписывать внутри функций, но setoid_rewrite
может.
В сторону: обратите внимание, что определение ex
и его обозначение exists x, ...
не встроены в Coq, ноопределены в стандартной библиотеке!Вы можете проверять подобные вещи с помощью Locate exists
(чтобы найти обозначения) и Print ex
(для просмотра определения).Также есть Unset Printing Notations.
, если вы не уверены, какие нотации используются, хотя имейте в виду, что существует множество нотаций, которые вы, вероятно, воспринимаете как должное, например /\
, =
и даже ->
.