나는 Coq 표준 라이브러리의 ListSet
모듈을 연구 중이다. 나는 조건문을 증명할 때 어떻게 추론 할 지 확신 할 수 없다. 예를 들어, 다음 증명에 문제가 있습니다. 정의는 문맥을 위해 제공된다.Coq의 조건부에 대한 이유는 어떻게 생각합니까?
Fixpoint set_mem (x : A) (xs : set) : bool :=
match xs with
| nil => false
| cons y ys =>
match Aeq_dec x y with
| left _ => true
| right _ => set_mem x ys
end
end.
Definition set_In : A -> set -> Prop := In (A := A).
Lemma set_mem_correct1 : forall (x : A) (xs : set),
set_mem x xs = true -> set_In x xs.
Proof. intros. induction xs.
discriminate.
simpl; destruct Aeq_dec with a x.
intuition.
simpl in H.
전류 방지 상태 가설로서 Aeq_dec
의 inr
포함한다. 나는 유도의 기본 경우와 inl
이 Aeq_dec
인 참 귀납 경우를 버렸다.
A : Type
Aeq_dec : forall x y : A, {x = y} + {x <> y}
x : A
a : A
xs : list A
H : (if Aeq_dec x a then true else set_mem x xs) = true
IHxs : set_mem x xs = true -> set_In x xs
n : a <> x
============================
a = x \/ set_In x xs
set_mem xs
에 해당하는 경우 a <> x
경우 H
사실이 할 수있는 유일한 방법. set_mem xs
을 얻으려면 H
에 조건부를 a <> x
에 적용 할 수 있어야합니다. 그러나, 나는 이것을하는 방법을 이해하지 못한다. 조건을 처리하거나 분해하거나 적용하려면 어떻게해야합니까?
나는 그것이 내가 이해한다고 믿습니다. '전술적 파괴 (Aeq_dec)'는'H '내부의 합계를 파괴하여 합계의 왼쪽과 오른쪽 브랜치에 대한 두 개의 부 목적을 생성합니다. 첫 번째 경우는 모순 된 가설을 만들어 내며 사소한 경우입니다. 두 번째는 귀납 가설의 전제를 소개한다. 나는 가설 속에 중첩 된 합계를 파괴 할 수 있다는 것을 깨닫지 못했다. 이것을 지적 해 주셔서 감사합니다. – danportin