Вопросы с тегами [coq]

0

голосов
0

ответ
7

Просмотры

Coq won't reduce expression involving decision procedure

Я использую Coq версии 8.8.1 и для жизни меня я не могу понять, почему он не будет оценивать значение следующего вычисления. Требовать Импорт Coq.Lists.List. Импорт Coq.Lists.List.ListNotations. Требовать Импорт Coq.Classes.EquivDec. Требовать Импорт Coq.Init.Nat. Требовать Импорт Coq.Arith.EqNat. Требовать Импорт Coq.Lists.ListSet. Требовать Импорт Coq.Bool.Bool. Индуктивный термин: Set: = | вар: физ -> термин | п: физ -> термин -> термин. Схема равенство на срок. Fixpoint uf_find (х: термин) (УФС: набор (набор термин)): опция (набор термин): = ПОИСКПОЗ UFS с | нет [] => None | эм :: UFS' => матч (set_In_dec term_eq_dec х э) с | левый _ => Некоторые эм | конец конец правой _ => uf_find х UFS. Вычислить uf_find (VAR) 3 ноль. (* Почему ISN» T это полностью снижается? *) Вычислить uf_find (вар 3) (против ноль ноль). Аналогичная функция с term_eq_dec вместо этого работает просто отлично: Fixpoint has_succ (х: физ) (л: термин списка): термин варианта: = матч л с | нет [] => None | ч :: л '=> матч term_eq_dec (вар (S х)) ч с | левый _ => Некоторая ч | правый _ => has_succ х»конец конец. Вычислить has_succ 3 [(Var 2); (Вар 1); (Вар 4)].
Akay
1

голосов
1

ответ
58

Просмотры

Как я могу использовать аргументы типа в ltac?

Я пытаюсь написать следующую функцию: Ltac restore_dims: = повтор матча гол с | [|? - контекст [@Mmult м н о A B]??] => Пусть матрица т «п»: = тип А в пусть матрицы п „“ о»: = тип B в заменить т с т 'легкого конца. То есть, я хочу использовать информацию о типах А и В (которые обе матрицы с 2 аргументами измерения) в моем Ltac. Возможно ли это, и если да, то как? (В идеале, это заменит м в вопросе с т»и аналогично для п и О для всех матричных продуктов в моей цели.)
Rand00
1

голосов
2

ответ
47

Просмотры

Определение функции, которая возвращает один элемент sastfying условия

Я хочу, чтобы объявить функцию, которая yeilds элемент (B, N), что б равно верно. Требовать Экспортировать список. Импорт Coq.Lists.List.ListNotations. Определение lstest: = список (BOOL * физ). Fixpoint existbool (л: lstest): опция (BOOL * физ): = матч л с | нет [] => None | (Б, п) :: л «=> если Ь, то некоторые (б, п) еще existbool л» конец. Функция всегда получить первый элемент satisfyting Ь = верно. Я хочу, чтобы выразить, что существует элемент satisfyting б = истина и возвращает элемент. Как я могу определить такую ​​функцию?
user10013740
1

голосов
0

ответ
115

Просмотры

Автоматически, специализирующаяся гипотезу Coq

В доказательствах, если я Проведем индукцию по аргументу, который не является окончательным, я получаю универсально quanitified индукции гипотез. Я считаю себя неоднократно писать тактику, как это: соответствие цели с | [Н: FORALL (esub: выражение) (х: exprvar) (Tsub т: Т) (gamma_: Гамма), (internalType gamma_ theta_ d esub Tsub?) -> (internalType (gamma_evar х Tsub :: gamma_)? ? theta_ д и др) -> internalType gamma_ theta_ д (esubst_expr esub х е) т, esub:???? выраж, xvar: exprvar, Tsub: Т, т: Т, gamma_: Гамма, H1: internalType gamma_ Тета ? d esub XSUB, H2:??? internalType (?? gamma_evar xvar Tsub :: gamma_) Theta d е т | - _] То есть, я ищу индукции, и аргументы, которые унифицировать с ним специализироваться его. Я тогда специализируюсь (гипотезы arg1 arg2 ...) Это выглядит как шаблонные, но я держу, чтобы писать другую версию для каждой леммы я использую это на. Есть ли способ: сделать это автоматически? сделать это автоматически, только для индукционных гипотез? (Так что мы не увязнуть в бесконечных циклах применения каждого аргумента каждую функцию возможной)
jmite
1

голосов
1

ответ
40

Просмотры

Смешение обязательства, порожденные `Program` тактикой

Я совершенно новый для Coq доказательства помощника, и я до сих пор нахожу мои ноги. Я столкнулся случай, который я не знаю, как бороться с: Я пытался использовать Программу Fixpoint тактику, чтобы ослабить требования на мой код, чтобы потом доказать необходимые свойства впоследствии как так называемые обязательства. В то время как большинство из них было легко, было два обязательства генерироваться цели, которые имели вид [а-вполне-SimpLee-XPR] = [-имя-функции моего] _obligation_3, вообще говоря, цели были ссылаются на другие обязательства, которые были доказаны ранее. Я попытался разворачивания и делать замены, но это не помогло. Если нет общего решения таких проблем, я могу отправить пробный сценарий + скриншот обязательства добавить некоторый контекст. Заранее спасибо.
InnocentusLime
1

голосов
2

ответ
340

Просмотры

Makefile с coqtop -R coqdir

У меня есть Makefile: Добавить команду: coqtop -R coqdir Я должен дать физический путь в моем компьютере, но этот каталог зависит от пользовательского каталога. (~ / Цвет / багажник / цвет / Devel / Gwen Devel и ~ / цвет / багажник / Цвет). Есть еще один способ вызова и объединить программу без учитывая физический путь? TMP / rainbow.native: TMP coqtop -q -R ~ / цвет / багажник / цвет / Devel / Gwen Devel -R ~ / цвет / багажник / Цвет -batch -load-vernac-источник extraction.v && (CD TMP && ocamlbuild -j 3 rainbow.native) TMP: MkDir -p $ @
Quyen
1

голосов
1

ответ
1.6k

Просмотры

Coq: Ошибка: Ссылка _ не найдена в текущей среде

Я новичок в Coq. У меня возникают проблемы определения списков, карт и деревьев с использованием единиц, продукции и суммы. Я получаю сообщение об ошибке в названии. Код выше замечания работает отлично, код ниже этого не делает. Индуктивный один: Тип: = ноль: один. Индуктивная сумма (t0 t1: Тип): Тип: = | inject_left: t0 -> сумма t0 t1 | inject_right: t1 -> сумма t0 t1. Индуктивный продукт (t0 t1: Тип): Тип: = пара: t0 -> t1 -> продукт t0 t1. Список определений (t0: Тип): Тип: = сумма одного (t0 продукта (список t0)). Определение карты (t0 t1: Тип): Тип: = список (продукт t0 t1). (* С этого момента ничего не работает. *) Список определений (t0: Тип): Тип: = сумма один (продукт t0 (Список t0)). Определение карты (t0 t1: Тип): Тип: = Sum один (продукт (продукт t0 t1) (карта t0 t1)). Определение Map (t0 t1: Тип): Тип: = Просуммировать один (продукт (продукт t0 t1) (Карта t0 t1)). Определение дерево (t0: Тип): Тип: = Sum один (t0 продукта (продукт (дерево t0) (t0 дерева))). Определение дерево (t0: Тип): Тип: = Sum один (t0 продукта (продукт (Tree t0) (t0 дерева))).
user1494846
1

голосов
1

ответ
96

Просмотры

Используйте Coq доказать разницу между относительными числами

Как вы докажете: FORALL млн: Z, т <п -> т -n <O в Coq? Большое спасибо!
WuZhu
1

голосов
1

ответ
238

Просмотры

Невозможно использовать инверсию индуктивного предиката

Я застрял на простое доказательство о индуктивном предикате. Я должен доказать, что естественный 0 не является положительным, где естественным список бита, и 0-либо список только с битами, которые 0s. H1: Pos ____________ препятствует представлению (1/1) Nat Этой глава Заверенной программировании с типами иждивенцев, кажется, предполагает ли я использовать инверсию, но я получаю сообщение об ошибке. Требовать Импорт Coq.Program.Program. Индуктивный Бит Тип: = | Зер: Bit | Один бит. Индуктивный Список (type1: Тип): Тип: = | Покупать право: Список типа1 | Наполните: type1 -> Список типа1 -> Список типа1. Неявные Аргументы покупать право [[type1]]. Неявные Аргументы Fill [[type1]]. Определение Nat: Тип: = Список бит. Индуктивные позы: Nat -> Prop: = | pos_1: FORALL nat1: Nat, позы (Fill One nat1) | pos_2: FORALL nat1: Nat, пос nat1 -> FORALL Бит 1: Бит, поз (Fill бит 1 nat1). Программа Fixpoint PRED (nat1: Nat) (H1: поз nat1): Nat: = матч nat1 с | = Покупать право> _ | Заполните Зер NAT2 => Fill One (Nat2 H1 пред Св) | Заполните один Nat2 => Fill ZeR Nat2 конца. Далее Обязательность. инверсия H1.
user1494846
1

голосов
1

ответ
167

Просмотры

модуль первого класса в Coq

Может кто-нибудь дать мне более подробную информацию о модуле первого класса в Coq? Я знаю, что модуль в Coq не первый класс. Я хотел бы знать причину, почему? и возможно, что в будущем модуль Coq может быть первым классом? большое спасибо
Quyen
1

голосов
3

ответ
151

Просмотры

Доказательство не-существования бесконечного индуктивного значения в Coq

Предположим, у меня есть очень простой индуктивный тип: индуктивный Ind: Set: = | ind0: Ind | ind1: Ind -> Произв. и я хотел бы, чтобы доказать, что некоторые значения не могут существовать. В частности, что не может быть не вполне обоснованные значения: ~ существует я, я = ind1 я. Я посмотрел вокруг немного в интернете и придумал ничего. Я был в состоянии написать: глубина Fixpoint (I: IND): физ: = матч я с | ind0 => 0 | ind1 i2 => 1 + i2 глубина конца. Цель ~ существует я, я = ind1 я. Доказательство. вступление. inversion_clear H. запомнить (глубина х) г. индукции д. переписать H0 в Heqd; Симпл в Heqd. дискриминировать. переписать H0 в Heqd; Симпл в Heqd. инъекции Heqd. предположение. QED. который работает, но, кажется, действительно некрасиво и необщего.
jon
1

голосов
1

ответ
112

Просмотры

Fixpoint по типам

Я хочу создать функцию (неподвижную опору, чтобы быть конкретными) в Coq, который принимает два типа в качестве входных данных и говорит, являются ли они одинаковыми или нет. Сигнатура этой функции может быть задана как Fixpoint areSame (X1 X2: Тип): BOOL Пожалуйста, дайте мне знать, если это вообще возможно или нет. Создать пользовательский тип данных, следующий индуктивный Состояние: Тип: = | состояние: FORALL X: Type, X -> Государство. Теперь я хочу, чтобы сравнить любые две данные строки. Допустим, я хочу, чтобы сравнить два состояния, образованные следующим образом, состояние BOOL правда, состояние BOOL ложь Для того, чтобы сделать это, я должен сначала подтвердить оба состояния определяются с типом BOOL, а затем сравнить значения с эквивалентности, определенной на BOOL. Вся помощь высоко ценится.
hckkid
1

голосов
1

ответ
188

Просмотры

Что такое идиоматических способ выразить счетную бесконечность в Coq?

Предположим, что я хотел бы утверждать, что бесконечное счетное число различных х: существует крестики. Моя первая догадка следовать определению счетной бесконечности буквально, например: Определение aleph_null (X: Тип): = существует (R: физ -> X -> Prop), (FORALL (п: физ), существует (х: х), R пх) / \ (FORALL (х: х), существует (п: физ) R пх) / \ (FORALL (п: физ) (ху: X) R пх -> R пу -> х = у) / \ (FORALL (нм: физ) (х: X) R пе -> R х -> п = т). Но это кажется немного громоздким для использования в реальных доказательствах, а не использовать библиотеки. Я думал, что я мог бы сделать его короче, используя существующее определение биективности, но все определения можно найти в о функциях, а не бинарные отношения. Есть ли лучше, идиоматический способ выразить счетную бесконечность в Coq?
user287393
1

голосов
1

ответ
49

Просмотры

Как «извлечь» Z из подмножества типа {Z: Z | г> 0}

Если функция взять Z в качестве аргументов, она также должна быть возможность принимать любое подмножество Z, верно? Например, Zmod принимает два Z и возвращение Z. Можно ли улучшить этот метод с типами субпопуляции без переопределения его? Я хочу это: Определение Z_gt0: = {г | г> 0}. Определение MyMod (n1 n2: Z_gt0): = Zmod n1 n2. Но Coq жалуется, что n1, как ожидается, типа Z, конечно. Как я могу заставить его работать с Z_gt0? Принуждать? Этот вопрос связан с моей другой здесь: Random нац потока и типов подмножества в Кок Edit: proj1_sig может сделать трюк, благодаря Coq IRC канал!
Olle Härstedt
1

голосов
2

ответ
74

Просмотры

Как я могу сделать интро в другом порядке, не используя обобщения зависит в Coq?

Учитывая, что у меня есть FORALL нм, есть способ это: интро п м. обобщает зависимый п. Но в один шаг, только применяя интро (или альтернативную тактику) только т?
Jakub Arnold
1

голосов
1

ответ
42

Просмотры

Применение hypotesis переменной

Скажем, я нахожусь в середине доказательства и у меня есть гипотезы, подобные этим: а: физ Ь: физ C: физ H: somePred аб и определение somePred говорит: Определение somePred (р: физ) (д: физ) : Опора: = FORALL (х: физ), р (х, р, д). Как применить H к с и получить P (C, а, б)?
poe123
1

голосов
2

ответ
72

Просмотры

Доказательство е X + е Y = Y + е (е X - 1) + 1, используя Coq

Так же, как название говорит, я ищу способ доказать й X + Y = е й Y + (й X - 1) + 1 в Coq. Я пытался применять различные комбинации plus_comm, plus_assoc и plus_permute, но я не был в состоянии сделать это пройти. Какие-либо предложения? Вот это окно цель: 3 подцель н: физ м: физ-й: состояние Н: ул У + й Х = п + т / \ beval й (BNOT (УР (AID Х) (Anum 0))) = TRUE ______________________________________ ( 1/3) -й Y + 1 + (Х-й - 1) = п + т
Adam
1

голосов
1

ответ
55

Просмотры

Поведение применить тактику, когда цель и применяется термин матч

Предположим, что мы имеем ABC: Опору Учитывая контекст с H:. A -> B -> C и одна цель A -> B -> C, то почему можно применить H, чтобы завершить доказательство, решение текущих и единственная цель ? Я думал применить тактику создает новую цель для каждого из аргументов термина применяется должен его заключение матча (или быть unifiable с) текущей целью.
ScarletAmaranth
1

голосов
1

ответ
103

Просмотры

Coq расчетно стиль biconditional цепь

Я пытаюсь доказать biconditional в Coq: PQ И я записал доказательство того, что имеет такую ​​структуру: PST Q таким образом: PQ Как я могу имитировать эту стойкую структуру расчетной в Coq? Заранее спасибо.
Martin Copes
1

голосов
3

ответ
374

Просмотры

Как доказать определение доказать в Coq

Сейчас я работаю с Coq и я сталкиваясь с проблемой, что я не знаю, как решить. Скажем, мы работаем с данным типом, я возьму нац для примера, и я хочу использовать функцию F, которая может потерпеть неудачу. Для того, чтобы компенсировать провал, мы определим п как тип нац -> опция физ. Теперь у меня есть данная гипотеза Н: физ -> Bool, при которых е не терпит неудачу, и я даже доказал лемму леммы no_error_in_f: ForAll (п: физ), Н п = истина -> существует (и: физ), п = Some и. Я хочу, чтобы определить функцию г: естествен-> нац, который дает результат е на п, если Нп выполнено, и просто дает п иначе. Эта функция должна быть четко определена, но я не знаю, как определить это правильно. Если бы я попробовать что-то наивное, как определение г (п: физ.): = Если Н п, то п еще п, существует проблема в системе печати.
tben
1

голосов
2

ответ
125

Просмотры

I need help defining a concatenation in Coq

Мне нужно определить функцию конкатенации, сначала некоторый контекст, я определяю набор «принимает» Индуктивный принимает: Set: = | Правда: принимает. , , | fun_m: принимает -> принимает -> принимает | n_fun: физ -> принимает -> принимает. Тогда мне нужно, чтобы иметь возможность манипулировать очень определенное подмножество принимает: первые и последние из них в списке, так Истинный и n_fun только. Я делаю это с соединением индуктивного и записи, как это: Индуктивный n_sub: принимает -> Prop: = | a1: n_sub Правда | а2: FORALL (п: физ) (А: принимает), n_sub А -> n_sub (n_fun п А). Запись к югу: Set: = mk_s {A: принимает; WS: (s_sub А)}. Как вы можете видеть, что это даст мне строки натуральных чисел, после чего, правда, исключительно, поэтому я хочу, чтобы иметь дело с подмножеством принимает, что дает п ... K True. Рассмотрим У меня есть два этих строк, Я хочу, чтобы определить функцию, которая посылает «абы ... Правда» и «х ... Правда» в «абах ... х ... Правда». Fixpoint конкатенации (A0 A1: принимает) (х: n_sub A0) (у: n_sub A1): принимает: = матч х, у с | a1, д => B | а2 п А0 х, у => (n_fun п (конкатенации А0 А1)) конец. Очевидно, что это не работает ... Я пробовал 100 вариаций этого: с помощью принимает непосредственно и отправки вещей к мочеиспусканию, используя запись внутри, смешивая принимает и к югу в различных вариациях, и т.д., и т.д. ... Я просто из идей и нужен кто-то, чтобы помочь мне исправить эту СЦЕПИТЬ, пожалуйста! Заранее спасибо за вашу помощь! у с | a1, д => B | а2 п А0 х, у => (n_fun п (конкатенации А0 А1)) конец. Очевидно, что это не работает ... Я пробовал 100 вариаций этого: с помощью принимает непосредственно и отправки вещей к мочеиспусканию, используя запись внутри, смешивая принимает и к югу в различных вариациях, и т.д., и т.д. ... Я просто из идей и нужен кто-то, чтобы помочь мне исправить эту СЦЕПИТЬ, пожалуйста! Заранее спасибо за вашу помощь! у с | a1, д => B | а2 п А0 х, у => (n_fun п (конкатенации А0 А1)) конец. Очевидно, что это не работает ... Я пробовал 100 вариаций этого: с помощью принимает непосредственно и отправки вещей к мочеиспусканию, используя запись внутри, смешивая принимает и к югу в различных вариациях, и т.д., и т.д. ... Я просто из идей и нужен кто-то, чтобы помочь мне исправить эту СЦЕПИТЬ, пожалуйста! Заранее спасибо за вашу помощь!
Sara
1

голосов
1

ответ
34

Просмотры

математические классы: Докажите, что MUNIT является его собственным отрицанием

Я только начал играть с библиотекой математики-классов, и я бы хотел, чтобы доказать следующую лемму: Требовать Импорт MathClasses.interfaces.abstract_algebra MathClasses.interfaces.vectorspace MathClasses.interfaces.canonical_names. Лемма Munit_is_its_own_negation `{модуль RM}: MUNIT = - MUNIT. Я планировал, чтобы доказать это так: Добавить MUNIT в правую сторону, используя right_identity: MUNIT = - MUNIT & MUNIT Используйте left_inverse на правой стороне: MUNIT = MUNIT Использование рефлексивности. Однако, когда я пытаюсь применить рерайт
Langston
1

голосов
1

ответ
88

Просмотры

Кок: определение функции от типа сигмы с его вторым выступом (и делает его принуждение)

У меня есть проблемы, доказывающий типа второй проекции от типа сигмы: Переменная X: Тип. Переменная Phy: X -> Type. Определение е {х: X}: {х: X & Phy х} -> Phy х. вступление. Нормально точный (@ projT2 _ _ X0). (* Термин "projT2 X0" имеет тип "PHY (projT1 X0)" в то время, как ожидается, имеют тип "PHY х" (не может объединить "(весело х: X => Phy х) (projT1 X0)" и «PHY х ") *) это тот случай, имеющий свидетельство {х: х & Phy х} (или {х: х | Phy х}.) недостаточно для получения свидетельства о Phy х с помощью проекций? В любом случае, я мог бы определить е (тупее), предположив свидетелей. Кроме того, я хочу, чтобы сделать его принуждение (но не): Сброс е. Определение PhyX: = {х: Х & Phy х}. Определение е {х: X} {г: Phy х} {у: PhyX}: PhyX -> Phy х: = весело у => г. Принуждение е: PhyX> -> Funclass. (* Е не уважают единообразное наследование условие *) Теперь вопрос: Могу ли я определить е более здрав и / или сделать это принуждение? EDIT: Я полагаю, предполагая, свидетельство о Phy х необходимо из-за способа existT объявлен: existT (х: А) (_ Р х). Вот лучший вариант 2 последних строк кода выше (до сих пор не может сделать это принуждение): Определение е {х: X} {ч: Phy х}: PhyX -> Phy х: = весело _ => projT2 ( existT _ _ ч). Принуждение е: PhyX> -> Phy. (* Е не уважает равномерное условие наследования *) т сделать это принуждение): Определение е {х: X} {ч: Phy х}: PhyX -> Phy х: = весело _ => projT2 (existT _ _ ч). Принуждение е: PhyX> -> Phy. (* Е не уважает равномерное условие наследования *) т сделать это принуждение): Определение е {х: X} {ч: Phy х}: PhyX -> Phy х: = весело _ => projT2 (existT _ _ ч). Принуждение е: PhyX> -> Phy. (* Е не уважает равномерное условие наследования *)
jaam
1

голосов
1

ответ
62

Просмотры

Функция определения без использования вспомогательной функции

Я читал через программное обеспечение Основы и решения проблем в ней. Это одна из определения Я пытаюсь определить: Fixpoint раскол {XY: Тип} (л: список (X * Y)): (список X) * (список Y) В основном это распакуйте версия Haskell. Я реализовал это следующим образом: Fixpoint split2 {XY: Тип} (л: список (X * Y)) (г: (список Х) * (список Y)): (список Х) * (список Y): = матч л с | [] => Г | (Х, у) = :: хз> split2 XS ((FST г) ++ [х], (СНД г) ++ [у]) конца. Fixpoint сплит {XY: Тип} (л: список (X * Y)): (список Х) * (список Y): = split2 л ([], []). У меня есть два вопроса: Можно ли определить разделение без использования вспомогательной функции, как split2 это? Есть ли эквивалент где п (например, в Haskell) в Coq?
Sibi
1

голосов
1

ответ
83

Просмотры

Coq: использование `PartialOrder` класс типов

Я пытаюсь определить лексикографический порядок на струнах над ч.у.м., но я не совсем уверен, как использовать PartialOrder класс типов. Требуется импорт списка RelationClasses. Сбой Индуктивный lex_leq {A: Тип} `{Ро: PartialOrder A}: список А -> Список A -> Prop: = | lnil: FORALL л, lex_leq ноль л | lcons: ForAll (HD1 HD2: A) (TL1 tl2: список А), HD1 (* ошибка *) (hd1 = HD2 -> lex_leq TL1 tl2) -> lex_leq (hd1 :: TL1) (HD2 :: tl2). Частичный выход: Термин «hd1» имеет тип «А» в то время как ожидается, имеют тип «НАТ». очевидно
1

голосов
1

ответ
48

Просмотры

Coq: import information about instances

Раздел Определение. Определение eq_dec X: = FORALL х: X, {х = у} + {х}. Существующие eq_dec класса. (* Любая функция, которая использует eq_dec не имеет значения - ↓ ↓ ↓ *.) Определение F {X: Тип} {DecX: eq_dec X} (ху: X): = х = у. Конец определения. Раздел секции MySection. Контекст {Т: Тип}. Гипотеза TEqDec: eq_dec Т. Индуктивный MyType: = | С: Т -> MyType. Instance myTypeEqDec: eq_dec MyType. Доказательство. ... Defined. (* Все нормально *) Пример Пример1: FORALL (t1 t2: MyType), F t1 t2. Доказательство. ... QED. Конец секции MySection. Раздел AnotherSection. Контекст {Т: Тип}. Гипотеза TEqDec: eq_dec T. (* Теперь я должен явно указать это - ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ Пример example2: FORALL (t1 t2: @myType T), @f _ (_ @myTypeEqDec TEqDec) t1 t2. Доказательство. ... QED. Конец AnotherSection. Как вы можете видеть в example1 Coq может найти экземпляр-информацию о MyType. Но после того, как я изменить раздел, вся информация о случаях исчезает, и я должен указать это в явном виде. Так что, когда у меня есть много типов-классов и экземпляров, код быстро становится грязным. Очевидно, я должен каким-то образом получить эту информацию обратно в контекст. Что такое правильный способ сделать это?
1

голосов
1

ответ
65

Просмотры

Установить изоморфизм между сигма в прод и несвязной суммы

Я определил индуктивный тип Буля, основанный на определении несвязной суммы по: Индуктивному Булю: = | inlb (а: блок) | INRB (б: единица). Указанные два типа A и B, что я пытаюсь доказать ismorphism между sigT (прикольных х: Буль => тычок ((экв х (INRB Tt)) -> А) (экв х (inlb Tt) -> B)) и A + BI удалось доказать одну сторону изоморфизма Определение sum_to_sigT {A} {B} (г: A + B): sigT (весело х: Буль => прод ((экв х (INRB тт)) -> A) ( экв х (inlb тт) -> В)). Доказательство. Случай г. ход => а. существует (INRB тт). перепишем // =. ход => б. существует (inlb тт). перепишем // =. Определено. Лемма eq_inla_inltt (а: единица): экв (inlb а) (inlb тт). Доказательство. на случай а. QED. Лемма eq_inra_inrtt (а: единица): э (INRB а) (INRB TT). Доказательство. на случай а. QED. Определение sigT_to_sum {A}, {B}, (ш: sigT (удовольствие х: Буль => прод ((экв х (INRB тт)) -> А) (экв х (inlb тт) -> Б))): А + В. Доказательство. разрушится ш. разрушится р. разрушится й. применяются (МНО (б (eq_inla_inltt а0))). применяются (INL (а (eq_inra_inrtt b0))). Определено. Определение eq_sum_sigT {A}, {B}, (х: А + В): экв х (sigT_to_sum (sum_to_sigT х)). Доказательство. к случаю х. Определено. Но я в беде доказать, с другой стороны, в основном потому, что не удается установить равенство между различными х и р, участвующих в следующем доказательстве: Определение eq_sigT_sum {A} {B} (у: sigT (весело х: Буль => прод ((экв х (INRB тт)) -> А) (экв х (inlb тт) -> Б))): экв у (sum_to_sigT (sigT_to_sum у)). Доказательство. случай: (sum_to_sigT (sigT_to_sum у)). двигаться => х р. уничтожить у. разрушится й. разрушится р. Определено. Кто-нибудь знает, как я могу доказать последнюю лемму? Спасибо за помощь. разрушится й. применяются (МНО (б (eq_inla_inltt а0))). применяются (INL (а (eq_inra_inrtt b0))). Определено. Определение eq_sum_sigT {A}, {B}, (х: А + В): экв х (sigT_to_sum (sum_to_sigT х)). Доказательство. к случаю х. Определено. Но я в беде доказать, с другой стороны, в основном потому, что не удается установить равенство между различными х и р, участвующих в следующем доказательстве: Определение eq_sigT_sum {A} {B} (у: sigT (весело х: Буль => прод ((экв х (INRB тт)) -> А) (экв х (inlb тт) -> Б))): экв у (sum_to_sigT (sigT_to_sum у)). Доказательство. случай: (sum_to_sigT (sigT_to_sum у)). двигаться => х р. уничтожить у. разрушится й. разрушится р. Определено. Кто-нибудь знает, как я могу доказать последнюю лемму? Спасибо за помощь. разрушится й. применяются (МНО (б (eq_inla_inltt а0))). применяются (INL (а (eq_inra_inrtt b0))). Определено. Определение eq_sum_sigT {A}, {B}, (х: А + В): экв х (sigT_to_sum (sum_to_sigT х)). Доказательство. к случаю х. Определено. Но я в беде доказать, с другой стороны, в основном потому, что не удается установить равенство между различными х и р, участвующих в следующем доказательстве: Определение eq_sigT_sum {A} {B} (у: sigT (весело х: Буль => прод ((экв х (INRB тт)) -> А) (экв х (inlb тт) -> Б))): экв у (sum_to_sigT (sigT_to_sum у)). Доказательство. случай: (sum_to_sigT (sigT_to_sum у)). двигаться => х р. уничтожить у. разрушится й. разрушится р. Определено. Кто-нибудь знает, как я могу доказать последнюю лемму? Спасибо за помощь. экв х (sigT_to_sum (sum_to_sigT х)). Доказательство. к случаю х. Определено. Но я в беде доказать, с другой стороны, в основном потому, что не удается установить равенство между различными х и р, участвующих в следующем доказательстве: Определение eq_sigT_sum {A} {B} (у: sigT (весело х: Буль => прод ((экв х (INRB тт)) -> А) (экв х (inlb тт) -> Б))): экв у (sum_to_sigT (sigT_to_sum у)). Доказательство. случай: (sum_to_sigT (sigT_to_sum у)). двигаться => х р. уничтожить у. разрушится й. разрушится р. Определено. Кто-нибудь знает, как я могу доказать последнюю лемму? Спасибо за помощь. экв х (sigT_to_sum (sum_to_sigT х)). Доказательство. к случаю х. Определено. Но я в беде доказать, с другой стороны, в основном потому, что не удается установить равенство между различными х и р, участвующих в следующем доказательстве: Определение eq_sigT_sum {A} {B} (у: sigT (весело х: Буль => прод ((экв х (INRB тт)) -> А) (экв х (inlb тт) -> Б))): экв у (sum_to_sigT (sigT_to_sum у)). Доказательство. случай: (sum_to_sigT (sigT_to_sum у)). двигаться => х р. уничтожить у. разрушится й. разрушится р. Определено. Кто-нибудь знает, как я могу доказать последнюю лемму? Спасибо за помощь. sigT (удовольствие х: Буль => прод ((экв х (INRB тт)) -> А) (экв х (inlb тт) -> Б))): экв у (sum_to_sigT (sigT_to_sum у)). Доказательство. случай: (sum_to_sigT (sigT_to_sum у)). двигаться => х р. уничтожить у. разрушится й. разрушится р. Определено. Кто-нибудь знает, как я могу доказать последнюю лемму? Спасибо за помощь. sigT (удовольствие х: Буль => прод ((экв х (INRB тт)) -> А) (экв х (inlb тт) -> Б))): экв у (sum_to_sigT (sigT_to_sum у)). Доказательство. случай: (sum_to_sigT (sigT_to_sum у)). двигаться => х р. уничтожить у. разрушится й. разрушится р. Определено. Кто-нибудь знает, как я могу доказать последнюю лемму? Спасибо за помощь.
burionk
1

голосов
1

ответ
72

Просмотры

Кок: Решить выражение для нескольких экземпляров

В сценарии, как это, я хочу одно выражение для решения в нескольких случаях: Индуктивный SR: Prop: = Sen | Inf. . Параметр CA S: Prop Параметр X:. SR -> Калифорния -> Prop -> Prop Параметр X ': SR -> Калифорния -> Prop -> Установить. Параметр XP: SR -> Калифорния -> Prop -> Тип. Определение гХ '(т: BOOL): SR -> CA -> Prop -> Тип: = если т, то X' еще XP. Контекст `{Ь: BOOL}` {с: BOOL} `{d: BOOL}` {s: SR} `{т: СР}` {и: СР} `{к: СА}` {л: СА} ` {м: CA} `{о: Проп}` {р: Проп} { `Q: Проп}. Параметр Foo: Ix»БСК о. Параметр Foo '': «Ix дум кв. Параметр сс: S. Класс CON (е: BOOL): = ап: если е то 'bsko -> гХ' Ix ctlp -> гХ»dumq еще S -> S -> S. Instance Кони: CON правда: = весело ( _: 'bsko) (_:' Ix Ix ctlp) => Foo ''. Instance Призывание: CON ложь: = забава (_: S) (_: S) => сс. Проверьте (_: CON ложь) сс. Проверьте (_: CON истина) Foo. Проверьте (_ _) CON сс. Проверьте (_: CON _) Foo. (* Ошибка: Термин «Foo» имеет типа «Икс» БСК O»в то время, как ожидается, имеет тип„S“*.) Есть ли способ сделать разрешение экземпляра работу ж / как (_: CON _) обув и (_: CON _) сс? Если нет, то попробуйте, чтобы преуспеть в сценарии, где классовые и / или экземпляры отличаются, в то время как ... Прибытие ... сс и проверка ... Foo одинакова, и решает функции удовольствия (_: S) (_ : S) => сс и весело (_: 'bsko) (_:' Ix Ix ctlp) => Foo '', соответственно. CON _) сс? Если нет, то попробуйте, чтобы преуспеть в сценарии, где классовые и / или экземпляры отличаются, в то время как ... Прибытие ... сс и проверка ... Foo одинакова, и решает функции удовольствия (_: S) (_ : S) => сс и весело (_: 'bsko) (_:' Ix Ix ctlp) => Foo '', соответственно. CON _) сс? Если нет, то попробуйте, чтобы преуспеть в сценарии, где классовые и / или экземпляры отличаются, в то время как ... Прибытие ... сс и проверка ... Foo одинакова, и решает функции удовольствия (_: S) (_ : S) => сс и весело (_: 'bsko) (_:' Ix Ix ctlp) => Foo '', соответственно.
jaam
1

голосов
1

ответ
60

Просмотры

Coq HOTT - Как правильно поставить определение в теореме?

Я завершил доказательство в Coq (как показано ниже) для теоремы 2.8.1 из книги HOTT в. Это работает, но я получаю это предупреждение Toplevel входа, символы 0-4: Внимание: Вложенные доказательства устарели и перестанем работать в будущей версии Coq [устаревшее вложенное-доказательство, устаревший] Я знаю, что это из-за определения внутри теоремы потому что, когда я ставлю их, предупреждение исчезло. Но единственное определение, которое я хочу быть глобальным является J. Как я могу удалить предупреждения при сохранении определений внутри теоремы? Требовать экспорт HOTT. Определение J (А: Тип) (Р: FORALL (х: А), х = у -> Тип) (час: FORALL х: А, Р хх idpath): FORALL (х: А) (р: х = у) , P xyp: = весело xyp => совпадение р с idpath => HX конца. Теорема th_2_8_1: FORALL (х: Unit), блок х = у. Доказательство. Определение г (ху: блок) (р: х = у): Единица измерения: = Р матч с idpath => конец TT. Определение F (ху: блок) (с: Единица): х = у: = совпадение х, у, с с тт, тт, тт => idpath конца. Определение альфа1 (ху: Unit) (s: Unit): ((Gxy) о (FXY)) s = s: = матч х, у, с с тт, тт, тт => idpath конца. Определение Р (е: FORALL (х: блок) (с: Единица), х = у) (г: FORALL (х: блок) (р: х = у), единицы) (х: блок) (р: х = у): Тип: = ((FXY) о (Gxy)) р = р. Определение (х: Unit): P fgxx idpath: = матч х с Tt => idpath idpath конца. Определение альфа2 (х: блок) (р: х = у): ((FXY) о (Gxy)) р = р: = (J единица (Р фг) з) х р. интро х лет. существует (FXY). (применяется BuildIsEquiv блока (х = у) (FXY) (Gxy) (альфа2 х) (альфа1 х)). индукция x0. перезапись = Матч х, у, с с тт, тт, тт => idpath конца. Определение альфа1 (ху: Unit) (s: Unit): ((Gxy) о (FXY)) s = s: = матч х, у, с с тт, тт, тт => idpath конца. Определение Р (е: FORALL (х: блок) (с: Единица), х = у) (г: FORALL (х: блок) (р: х = у), единицы) (х: блок) (р: х = у): Тип: = ((FXY) о (Gxy)) р = р. Определение (х: Unit): P fgxx idpath: = матч х с Tt => idpath idpath конца. Определение альфа2 (х: блок) (р: х = у): ((FXY) о (Gxy)) р = р: = (J единица (Р фг) з) х р. интро х лет. существует (FXY). (применяется BuildIsEquiv блока (х = у) (FXY) (Gxy) (альфа2 х) (альфа1 х)). индукция x0. перезапись = Матч х, у, с с тт, тт, тт => idpath конца. Определение альфа1 (ху: Unit) (s: Unit): ((Gxy) о (FXY)) s = s: = матч х, у, с с тт, тт, тт => idpath конца. Определение Р (е: FORALL (х: блок) (с: Единица), х = у) (г: FORALL (х: блок) (р: х = у), единицы) (х: блок) (р: х = у): Тип: = ((FXY) о (Gxy)) р = р. Определение (х: Unit): P fgxx idpath: = матч х с Tt => idpath idpath конца. Определение альфа2 (х: блок) (р: х = у): ((FXY) о (Gxy)) р = р: = (J единица (Р фг) з) х р. интро х лет. существует (FXY). (применяется BuildIsEquiv блока (х = у) (FXY) (Gxy) (альфа2 х) (альфа1 х)). индукция x0. перезапись Определение Р (е: FORALL (х: блок) (с: Единица), х = у) (г: FORALL (х: блок) (р: х = у), единицы) (х: блок) (р: х = у): Тип: = ((FXY) о (Gxy)) р = р. Определение (х: Unit): P fgxx idpath: = матч х с Tt => idpath idpath конца. Определение альфа2 (х: блок) (р: х = у): ((FXY) о (Gxy)) р = р: = (J единица (Р фг) з) х р. интро х лет. существует (FXY). (применяется BuildIsEquiv блока (х = у) (FXY) (Gxy) (альфа2 х) (альфа1 х)). индукция x0. перезапись Определение Р (е: FORALL (х: блок) (с: Единица), х = у) (г: FORALL (х: блок) (р: х = у), единицы) (х: блок) (р: х = у): Тип: = ((FXY) о (Gxy)) р = р. Определение (х: Unit): P fgxx idpath: = матч х с Tt => idpath idpath конца. Определение альфа2 (х: блок) (р: х = у): ((FXY) о (Gxy)) р = р: = (J единица (Р фг) з) х р. интро х лет. существует (FXY). (применяется BuildIsEquiv блока (х = у) (FXY) (Gxy) (альфа2 х) (альфа1 х)). индукция x0. перезапись ((FXY) о (Gxy)) р = р: = (J единица (Р фг) з) ху р. интро х лет. существует (FXY). (применяется BuildIsEquiv блока (х = у) (FXY) (Gxy) (альфа2 х) (альфа1 х)). индукция x0. перезапись ((FXY) о (Gxy)) р = р: = (J единица (Р фг) з) ху р. интро х лет. существует (FXY). (применяется BuildIsEquiv блока (х = у) (FXY) (Gxy) (альфа2 х) (альфа1 х)). индукция x0. перезапись
Carlos Pinzón
1

голосов
1

ответ
234

Просмотры

Программные основы: доказав leb_complete и leb_correct

Я работаю через Том 1 Бенджамин Пирс, и др., Программное обеспечение Фундаменты, и я застрял на пару проблем в главе IndProp. К сожалению, я не знаю лучшего места, чтобы спросить: Кто-нибудь есть какие-то намеки? Теорема leb_complete: FORALL нм, LEB нм = истина -> п
Tommy McGuire
1

голосов
1

ответ
60

Просмотры

Как я могу переписать выборочно в Coq?

: с физ ПВС: список физ Н: а = макс (MAXNUM ПВС) а + 1 H1: макс (MAXNUM ПВС) а> = а Doing переписывания H в H1, заменяет оба, как в то время как я только хочу, чтобы переписать дальше. РИТ. Можно ли это сделать? Я хочу, чтобы доказать ложь из вышеупомянутых двух гипотез.
abhishek
1

голосов
1

ответ
82

Просмотры

Coq доказательство того, что дополнение инволютивно

Как я могу доказать, что дополнение множества инволютивно? Требовать Импорт Ансамбли. Аргументы В {_}. Аргументы комплемента {_}. Переменные (T: Тип) (A: Ансамбль Т). Аксиома set_eq: FORALL (E1 E2: Ансамбль Т), (FORALL х Е1 х Е2 х) -> Е1 = Е2. Лемма complement_involutive: FORALL х, В (комплемента (комплемента А)) х -> в х. EDIT: Предположим, что разрешима (в х) позволяет доказать первого пор дка леммы полностью.
larsr
1

голосов
1

ответ
71

Просмотры

Как установить библиотеки Coq без руководства по установке?

Многие библиотеки Coq на GitHub не обеспечивает установку направляющих / и т.д. документации. Может быть, есть общий способ / способы установки таких библиотек? Например, x86proved https://github.com/nbenton/x86proved Как установить это?
1

голосов
1

ответ
136

Просмотры

Комментарии в _CoqProject

Есть ли способ, чтобы получить комментарии в файле _CoqProject? Я хотел бы собрать только часть библиотеки, без полного удаления всех других файлов из файла _CoqProject.
Rincewind
1

голосов
1

ответ
126

Просмотры

Compute if in a decideable prop in coq

Я хочу, чтобы написать функцию, которая рассчитать количество истинных значений р 0 .. пт в естествен-> пропеллера функции. Раздел count_sc. Переменная р: естествен-> Prop. Гипотеза p_dec: FORALL х: физ, {точек} + {~} точек. Fixpoint счетчик (х: физ): = матч х с | 0 => если p_dec (0), то 1 еще 0 | S у => если p_dec (х), то 1 + рассчитывать у другого количества у конца. Конец count_sc. Определение лада (х: физ): = False. Проверить количество. Аксиома fret_dec: FORALL х: физ, {ладу х} + {~ ладу х}. Теорема hello_decide: FORALL х: нац, граф лада fret_dec х = 0. Доказательство. интро. индукция х. раскрываться счет. заменить (fret_dec 0) с ложными. QED. Прежде чем заменить тактику я должен доказательство какая-то цель, как это: (если fret_dec 0, то 1 еще 0) = 0 Coq доза не автоматически вычислить значение, если заявление. и если я пытаюсь заменить fret_dec с ним» s значение, то я получаю эту ошибку: Ошибка: Условия не имеют конвертируемые типов. Как я могу написать функцию подсчета, что я могу раскрыться и использовать его в теоремах?
hamid k
1

голосов
1

ответ
28

Просмотры

Текущее необходимое количество аргументов для развертывания с помощью `simpl`

В Coq Справочное руководство подробно описано, как использовать директиву Arguments с / чтобы отметить константу раскладываются в SIMPL тактике только если достаточное количество аргументов в комплекте поставки. Есть ли способ, чтобы увидеть, сколько аргументов аргументов в настоящее время постоянный требует, чтобы быть развернуты? Кроме того, есть ли способ, чтобы увидеть, если константа была помечена никогда не будет упрощена Simpl?
Ifaz Kabir
1

голосов
1

ответ
81

Просмотры

Определение подтипа отношения в Coq

Есть ли способ определить подтип отношения в Coq? Я читал о подмножестве вводе, в котором предикат используется для определения того, что происходит в подтип, но это не то, что я стремлюсь. Я просто хочу, чтобы определить теорию, в которой есть тип (U) и другого типа (I), который является подтипом (U).
ymmagdi
1

голосов
1

ответ
109

Просмотры

Wrong Typeclass Instance used in Coq Proof

Я пытаюсь выполнить следующее доказательство, основанное на конечных картах, как это определено в CoqExtLib. Тем не менее, у меня проблема, когда экземпляр RelDec появляется в доказательстве, отличается, например, что я думаю, объявляется. Требовать Импорт ExtLib.Data.Map.FMapAList. Требовать ExtLib.Structures.Sets. Модуль DSET: = ExtLib.Structures.Sets. Требовать ExtLib.Structures.Maps. Модуль Карта: = ExtLib.Structures.Maps. Требовать Импорт ExtLib.Data.Nat. Требовать Импорт Coq.Lists.List. Определение Карта киловольты:. = Крен к v Определение ОЕ = физ. Определение сигма: Тип: = (Карта LOC физ). Лемма not_in_sigma: FORALL (LL ': LOC) (е: физ) (с: сигма), LL' -> Map.lookup л ((л», е) :: з) = Map.lookup л ы. интро. Симпл. утверждают (RelDec.rel_dec LL '= верно -> L = L'). поза (ExtLib.Core.RelDec.rel_dec_correct LL» ) Насколько я. уничтожить я. (* Я: = RelDec.rel_dec_correct LL «: RelDec.rel_dec LL» = верно л> = л '*) Как вы можете видеть, я пытаюсь использовать тот факт, что rel_dec должен оценить ложь, если ее два входа не являются равны. Это, кажется, в соответствии с определением, данным в ExtLib.Data.Nat: Global Instance RelDec_eq: RelDec (@eq физ): = {rel_dec: = EqNat.beq_nat}. Тем не менее, в коде я показал выше, он использует> = вместо = как отношение, что конечное отображение параметризованных на, так что я не могу применить теорему rel_dec_correct. Почему это происходит? Как экземпляр для RelDec выбирают? Есть ли что-то особенное, что нужно сделать при доказательстве теоремы о типах квалифицированы классами типов? Как я могу получить версию rel_dec_correct, которая относится к равенству, не более, чем? RelDec.rel_dec LL «= верно л> = л» *) Как вы можете видеть, я пытаюсь использовать тот факт, что rel_dec должен оценить ложь, если ее два входа не равны. Это, кажется, в соответствии с определением, данным в ExtLib.Data.Nat: Global Instance RelDec_eq: RelDec (@eq физ): = {rel_dec: = EqNat.beq_nat}. Тем не менее, в коде я показал выше, он использует> = вместо = как отношение, что конечное отображение параметризованных на, так что я не могу применить теорему rel_dec_correct. Почему это происходит? Как экземпляр для RelDec выбирают? Есть ли что-то особенное, что нужно сделать при доказательстве теоремы о типах квалифицированы классами типов? Как я могу получить версию rel_dec_correct, которая относится к равенству, не более, чем? RelDec.rel_dec LL «= верно л> = л» *) Как вы можете видеть, я пытаюсь использовать тот факт, что rel_dec должен оценить ложь, если ее два входа не равны. Это, кажется, в соответствии с определением, данным в ExtLib.Data.Nat: Global Instance RelDec_eq: RelDec (@eq физ): = {rel_dec: = EqNat.beq_nat}. Тем не менее, в коде я показал выше, он использует> = вместо = как отношение, что конечное отображение параметризованных на, так что я не могу применить теорему rel_dec_correct. Почему это происходит? Как экземпляр для RelDec выбирают? Есть ли что-то особенное, что нужно сделать при доказательстве теоремы о типах квалифицированы классами типов? Как я могу получить версию rel_dec_correct, которая относится к равенству, не более, чем? м пытаются использовать тот факт, что rel_dec должен оценить ложь, если ее два входа не равен. Это, кажется, в соответствии с определением, данным в ExtLib.Data.Nat: Global Instance RelDec_eq: RelDec (@eq физ): = {rel_dec: = EqNat.beq_nat}. Тем не менее, в коде я показал выше, он использует> = вместо = как отношение, что конечное отображение параметризованных на, так что я не могу применить теорему rel_dec_correct. Почему это происходит? Как экземпляр для RelDec выбирают? Есть ли что-то особенное, что нужно сделать при доказательстве теоремы о типах квалифицированы классами типов? Как я могу получить версию rel_dec_correct, которая относится к равенству, не более, чем? м пытаются использовать тот факт, что rel_dec должен оценить ложь, если ее два входа не равен. Это, кажется, в соответствии с определением, данным в ExtLib.Data.Nat: Global Instance RelDec_eq: RelDec (@eq физ): = {rel_dec: = EqNat.beq_nat}. Тем не менее, в коде я показал выше, он использует> = вместо = как отношение, что конечное отображение параметризованных на, так что я не могу применить теорему rel_dec_correct. Почему это происходит? Как экземпляр для RelDec выбирают? Есть ли что-то особенное, что нужно сделать при доказательстве теоремы о типах квалифицированы классами типов? Как я могу получить версию rel_dec_correct, которая относится к равенству, не более, чем? в коде я показал выше, он использует> = вместо = как отношение, что конечное отображение параметризованных на, так что я не могу применить теорему rel_dec_correct. Почему это происходит? Как экземпляр для RelDec выбирают? Есть ли что-то особенное, что нужно сделать при доказательстве теоремы о типах квалифицированы классами типов? Как я могу получить версию rel_dec_correct, которая относится к равенству, не более, чем? в коде я показал выше, он использует> = вместо = как отношение, что конечное отображение параметризованных на, так что я не могу применить теорему rel_dec_correct. Почему это происходит? Как экземпляр для RelDec выбирают? Есть ли что-то особенное, что нужно сделать при доказательстве теоремы о типах квалифицированы классами типов? Как я могу получить версию rel_dec_correct, которая относится к равенству, не более, чем?
jmite
1

голосов
1

ответ
72

Просмотры

Как я могу доказать, что она не может доказать Or_commutative только интро и применять?

Этот вопрос относится к стратегической игре (переговоры, протокол, крипто, ...) заходящего я исследую во время праздников, где игроки являются пользователи Coq. Некоторые из них имеют ограниченные возможности рассуждения, такие как, например, будучи только в состоянии интро и применить гипотезу или лемму они были даны. Некоторые другие могут иметь доступ к tauto. В отличие от этого, некоторые рациональные игроки имеют неограниченные возможности мыслительные и знать тип других игроков. Поэтому рациональные игроки могут отражать на то, что другие игроки могут доказать или нет, и строить свое решение на нем для своего следующего хода в игре. Нерациональные игроки никогда не получить доступ к терминам CIC. Поэтому я ограничиваю свою грамматику Ltac к последовательному, но меньшему фрагменту. Я также ограничить их список атомной тактики. Например, я не позволил бы вариант применять с узорами или другой, который открывает дверь в терминах CIC. В случае этого вопроса, это просто конечная последовательность ванильного интро и применить тактику, разделенную точкой. Итак, тип игрока определяются с помощью грамматического подмножества Ltac, списка атомной тактики и мешка чешуй данных в начале игры. Вот самый многословный (наименьшие шаги) доказательство тавтологии: Лемма Or_commutative: FORALL PQ: Опора, P \ / Q -> Q \ / P. Доказательство. введение P. интро Q. интро H. H. элим интро HP. право. применять HP. интро HQ. оставил. применять HQ. QED. Совершенно очевидно, что нам нужно Елима правую и левую тактику. Введение и применение недостаточно. Вопрос: как я могу доказать, что она не может доказать Or_commutative только интро и применять? Цель cannot_prove_or_commutative_with_IAs: ???? Доказательство.
FZed
1

голосов
1

ответ
36

Просмотры

Кок: соответствие внутри определения индуктивного

Я хотел бы реализовать в Coq что-то вроде следующего кода: индуктивный IT: = | c1: IT | с2 (х: IT) (H: матч х при х возвратного Prop с | c1 => True | c2 у => Ложные конец): IT. Но это не возможно, чтобы соответствовать неопределенный тип. Как преодолеть это препятствие? (Мне нужно проверить некоторые свойства термина, прежде чем использовать его, например, цель -., Чтобы проверить правильность подформулы перед созданием большей формулы.)
ged

Просмотр дополнительных вопросов