나는 나를 놀라게하는 것을 이해하려고 노력하고있다. 다음 두 가지 정의를 고려하십시오.직관 주의적 정의에있어서 놀랄만 한 암시 적 가정
Require Import List.
Variable A:Type.
Inductive NoDup : list A -> Prop :=
NoDup_nil : NoDup nil
| NoDup_cons : forall x l, ~ In x l -> NoDup l -> NoDup (x :: l).
Inductive Dup : list A -> Prop :=
Dup_hd : forall x l, In x l -> Dup (x :: l)
| Dup_tl : forall x l, Dup l -> Dup (x :: l).
내 첫 번째 직관은 똑같은 말 (하지만 부정)입니다. 그러나 @Arthur Azevedo De Amorim은 정확히 일치하지 않음을 나타냅니다 (or see here). ~ NoDup l -> Dup l
인 경우 forall (a b:A), ~ a <> b -> a = b
인 경우 여야합니다. 따라서, A
유형에 대한 추가 가정은 증명 목표를 나타낼 때 Dup
이 아닌 ~ NoDup
을 사용하면 잠식합니다.
나는이 여분의 가정이 도입 된 곳을 찾아 내서 무슨 일이 일어 났는지에 대한 정신적 모델을 얻으려고 노력 했으므로 다음 번에 직접 볼 것입니다.
~ In x l
용어 만 생성 할 수 있기 때문에 하나는 첫 번째 요소에서 특정 x
이라고 다른을 입증 할 수 있다면 내 현재의 설명은, 그것은 책임 NoDup_cons
에 ~ In x l
인수가
- 이다 나는 용어 옴 유형
NoDup (_::_)
을 파괴 할 때 등 목록, 목록의 두 번째 요소,
그래서 난 단지 유형생성 된 수있는 용어 ~ In _ _
를 얻을 수에 대해 ~ a <> b -> a = b
이 있어야합니다.
Q : 괜찮은 '비공식적 인 방식으로 생각하고 계신가요? 아니면 그것을 이해하는 더 좋은 방법이 있습니까? 그렇기 때문에 나는 다시 그 함정에 빠지지 않습니까?
또한, 나는 그들이 NoDup
대신 Dup
의를 사용하여 공식화 되었기 때문에 Coq library contains NoDup
하지 Dup
, 그래서 아마 약간의 보조 정리, 그들은 할 필요가보다 약한 것으로 나타났습니다. 그러나 으로 공식화 될 수 있으므로 ~Dup l -> NoDup l
입니다.
음 (. 나는 표준 라이브러리는
NoDup
하지Dup
을 가지고 다소 이상한 동의) - 그것은 단지입니다 'Dup l'은 일반적으로 일반적인 제안이 아니므로'~ NoDup l <-> ~~ Dup l'은'Dup l'과 동일하지 않습니다. –