Похоже, вам нужно помнить тот факт, что следующее выражение
ismember (set-union (set-pair m n)) x
действительно равно
false
Это очень распространенная проблема, возникающая из«с» строительные работы. По умолчанию у вас нет доступа к элементу доказательства, который связывает элемент, с которым сопоставляется шаблон, с результатом сопоставления с шаблоном, то есть в вашем примере это элемент типа:
ismember (set-union (set-pair m n)) x == false
Чтобы получить элемент этого типа, вам нужно использовать идиому «осмотра», который определен наряду с пропозициональным равенством в стандартной библиотеке. Более конкретно, это означает, что вам нужно будет добавить новый элемент в сопоставление с образцом следующим образом:
... | ismember (set-union (set-pair m n)) x | inspect (ismember (set-union (set-pair m n)) x
Это приведет к тому, что вы получите доступ как к «ложному», так и к требуемому элементу доказательства. Для получения дополнительной информации об идиоме осмотра см .:
- Вики-страница на with-abtraction: https://agda.readthedocs.io/en/v2.6.0.1/language/with-abstraction.html
- Файл PropositionalEquality.agda в стандартной библиотеке, который предоставляетидиома, а также краткое описание того, как его использовать
- Файл README / Inspect.agda в стандартной библиотеке, а также полный пример того, как и когда использовать инспекцию идиома