확실하지 경우 숙제 또는 독립적 인 연구 ...
Theorem beq_str_refl : forall i,
true = beq_str i i.
Proof.
induction 0; simpl; try (rewrite <- IHi; case (ascii_dec a a));
try reflexivity; intro C; elimtype False; apply C; reflexivity.
Qed.
이 작동합니다 : 여기 내 코드입니다.
숙제이고 게으르다면 교사가이 문제를 거부 할 것입니다. 자신을 이해하고 증명하기를 원한다면, 필요한 빌딩 블록이 거기에 있고, 그냥 분해하고 현재의 증명 상태로 조각을 던져 넣으십시오.
이 증거에는 두 가지 이상한 점이 있습니다. 첫 번째는 (ascii_dec a a)
을 제거합니다. (a
의 사례 분석은 작동하지 않습니다.) 전체 사례 (즉, (ascii_dec a a)
)에 대한 사례 분석을 수행하여 두 개의 부표 (가설 a = a
을 추가하고 다른 하나는 a <> a
)을 얻습니다.
두 번째 문제는 이전에 해본 적이없는 한 모순과 관련이있을 수 있습니다.
a <> a
은 a = a -> False
과 같습니다. a = a
은 정의에 의해 true이며, False
유형의 값을 구성 할 수 있습니다 (모순 - False
에는 생성자가 없음). 이렇게하면 현재 목표를 버릴 수 있습니다 (true = false
은 증명할 수 없습니다). 불가능한 것은 False
값으로 구성하십시오.
elimtype False
을 입력하면 케이스 분석을 진행하려는 Coq에게 False
을 알립니다. False
에는 생성자가 없으므로 값이 False
인 단일 목표를 갖습니다. 일반적으로 그것은 불가능할 것이지만, 당신은 당신의 가설들 사이에 모순이 있습니다. apply
이 모순 (위의 증명 스크립트에 C
으로 이름 지어 짐)은 reflexivity
다음에 표시되는 a = a
으로 표시됩니다.
Theorem beq_str_refl : forall i, true = beq_str i i.
intro i. induction i as [ | a i IHi ].
(* base case: Empty String *) reflexivity.
(* inductive case: *) simpl. rewrite <- IHi.
(* do case analysis on ascii_dec (or {a=a}+{a<>a}) *)
destruct (ascii_dec a a) as [ Heq | C ].
(* {a = a} *) reflexivity.
(* {a <> a} *) unfold not in C. elimtype False. apply C. reflexivity.
모순을 처리하는 또 다른 방법 : 솔루션에 대한
(* just a quick nonsensical goal *)
Theorem foo: forall i, i <> i -> 2 + 2 = 5.
intros i C.
(* explicitly construct a 'False' value *)
assert False as H.
apply C. reflexivity.
(* 'inversion' generates one goal per possible constructor *)
(* as False has no constructors, this gives 0 subgoals, finishing the proof *)
inversion H.
Qed.
덕분에 여기
는 단계별 할 수있는 더 읽기 쉬운 버전입니다. 그것의 나의 독립적 인 일. 전술이 한 가지에 있기 때문에 ';' 그래서 나는 각 전술 후에 무슨 일이 일어나는지를보기 위해 하나씩 실행하려고 노력하고 있습니다. – Khan
마지막 하나는 꽤 흥미 롭습니다. 감사. – Khan