Одна часть проблемы заключается в том, что вы не рассуждаете с отрицанным предикатом так же, как вы рассуждаете с прямым предикатом. Вы должны снова подумать с точки зрения логики c, прежде чем ожидать, что Coq будет работать для вас.
Давайте go вернемся к очень основному c логическому выводу "Все люди смертны, Сократ - человек поэтому он смертен ". Если моя кошка смертна, значит ли это, что моя кошка - человек? Нет! Когда вы работаете с отрицанием, проблема очень близка к этому.
Теперь давайте сосредоточимся на вашей проблеме. Существует спецификация c tacti c, чтобы помочь доказать основные c случаи равенства reflexivity
. Существует также спецификация c tacti c, чтобы помочь доказать базовые c случаи "неравенства". Эта тактика c называется discriminate
, и она будет работать в вашем случае.
Отрицание равенства проявляется в вашем упражнении двумя различными способами. Иногда вам нужно доказать отрицание равенства, которое очевидно невооруженным глазом, и в этом случае discriminate
может выполнить эту работу. Иногда вам нужно доказать отрицание равенства, которое явно недоказуемо (я попробую это позже). В этом случае путь к прогрессу состоит в том, чтобы обнаружить, что в вашей цели есть предположение, которое на самом деле содержит внутреннее противоречие, или что две гипотезы противоречат друг другу. В этом случае решение состоит в том, чтобы попытаться destruct H
, где H
- гипотеза, которая явно неверна.
В случае вашего упражнения вам также необходимо понять, как справиться с or
в гипотезе, destruct
все еще будет иметь отношение к этому случаю.
Я предлагаю вам прочитать бесплатный документ (coq в спешке) [https://cel.archives-ouvertes.fr/inria-00001173v6/document] в качестве учебного пособия для это. В частности, это объясняет, что для каждой логической конструкции способ обработки этой конструкции различен, независимо от того, появляется ли конструкция в качестве вывода цели или в качестве гипотезы. Существует короткая таблица, которая будет использоваться в качестве первого списка подсказок для большинства базовых c этапов рассуждения.
Еще один совет: не используйте команду Fixpoint
, когда вы используете функцию, которую вы sh определить не является рекурсивным. В вашем случае функция bloodType
должна быть определена с использованием ключевого слова Definition
. Использование Fixpoint
делает определение бесполезно сложным, и это может укусить вас позже в ваших экспериментах.
Я рад видеть, что вы учитесь самостоятельно, развлекаетесь и задаете вопросы!