2015-04-24 4 views
2

У меня есть определение равенства:Использование Определение Coq Равенства

Definition reglang_eq := 
    forall (A : Set) 
    (r1 r2 : RegularLanguage A), 
    (forall xs : List A, 
    EvalInRegLang A r1 xs <-> EvalInRegLang A r2 xs) 
    -> r1 = r2 
. 

и подцель:

Concat A (EmptyStr A) r = Concat A r (EmptyStr A) 
(* note: Concat is a RegularLanguage constructor *) 

и когда я пытаюсь применить или переписать reglang_eq, я получаю сообщение об ошибке. Если я правильно понимаю, это должно быть просто потому, что я не знаю правильного синтаксиса, но я все больше расстраиваюсь, потому что не смог найти документацию, которую я могу понять. (Несмотря на то, сколько месяцев я спотыкался, проверяя материал о RegularLanguages.)

Любая помощь приветствуется, спасибо.

ответ

2

Если Concat действительно является конструктором языка, вы не сможете доказать свою цель. Там две проблемы, происходящие здесь:

  1. Когда вы записали reglang_eq, вы определили предложение, но не дают никаких доказательств этого. То, что вы хотите сделать, это заменить: = на двоеточие (:), чтобы вы могли войти в режим доказательства и обосновать свои претензии. Когда вы это сделаете и закончите свое доказательство, вы сможете применить его. Но если вы попытаетесь сделать это, вы попадете во второй выпуск ...

  2. В Coq конструкторы всегда не пересекаются. Это означает, что единственный способ, которым ваше уравнение может быть истинным, - это когда r = EmptyStr A (предполагая, что последний также является конструктором). Здесь вы, вероятно, хотите определить другое представление для регулярных языков, чтобы конкатенация и пустой язык стали определяемыми операциями (I.e.функциями, определенными внутри логики).

+0

Спасибо, и сожалею о позднем ответе. Поэтому, если я правильно понимаю это, я не могу сказать, что 'EvalInRegLang A r1 xs <-> EvalInRegLang A r2 xs' подразумевает' r1 = r2', потому что Coq его не принимает. '=' может использоваться только для конструктивного равенства. В этом случае, я думаю, мой вопрос в том, есть ли способ показать равенство Set? Поскольку наборы не нужно строить одинаково, чтобы они были одинаковыми. (Я предполагаю?) Должен ли это быть новым вопросом? – user2063685

+0

@ user2063685 Это зависит от того, что вы подразумеваете под «Set». Я думаю, что это достаточно интересно, чтобы заслужить свой собственный вопрос, на который я с удовольствием отвечу :) –

Смежные вопросы