일반 언어로만 제한되므로 매우 간단합니다. 접이식을 사용해야합니다.
Require Import Coq.Lists.List.
Import ListNotations.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Record dfa (S A : Type) := DFA {
initial_state : S;
is_final : S -> bool;
next : S -> A -> S
}.
Definition run_dfa S A (m : dfa S A) (l : list A) : bool :=
is_final m (fold_left (next m) l (initial_state m)).
이 조각은 국가와 알파벳 구성 요소가 이제 DFA의 매개 변수를 입력하는 점에서 원래 정의에서 약간 다르다, 그리고 내가이 술어와 최종 상태를 교체 한 다음은 샘플입니다 우리가 받아들이는 국가에 있든 없든 대답합니다. run_dfa
함수는 DFA의 전환 함수를 초기 상태에서 시작하여 단순히 반복 한 다음 마지막 상태가 수락 상태인지 여부를 테스트합니다.
이 인프라를 사용하여 일반 언어를 거의 설명 할 수 있습니다.
Inductive ab := A | B.
Inductive ab_state : Type :=
ReadA | ReadB | Fail.
Definition ab_dfa : dfa ab_state ab := {|
initial_state := ReadA;
is_final s := match s with Fail => false | _ => true end;
next s x :=
match s, x with
| ReadB, A => Fail
| ReadA, B => ReadB
| _, _ => s
end
|}.
우리는이 기계적으로 우리가 무엇을 기대한다는 것을 증명할 수있다 : 예를 들어, 여기 a*b*
을 인식 자동 장치입니다. 우리는 또한 그 언어의 문자열 및 아무것도를 수용하는 것을 말한다 역을 명시 할 수
Lemma ab_dfa_complete n m : run_dfa ab_dfa (repeat A n ++ repeat B m) = true.
Proof.
unfold run_dfa. rewrite fold_left_app.
assert (fold_left (next ab_dfa) (repeat A n) (initial_state ab_dfa) = ReadA) as ->.
{ now simpl; induction n as [| n IH]; simpl; trivial. }
destruct m as [|m]; simpl; trivial.
induction m as [|m IH]; simpl; trivial.
Qed.
: 여기가 추구 언어의 문자열을 받아들이는 것을 말한다 정리입니다. 나는 증거를 남겼다. 그것을 파악하는 것이 어렵지 않아야합니다.
Lemma ab_dfa_sound l :
run_dfa ab_dfa l = true ->
exists n m, l = repeat A n ++ repeat B m.
불행하게도, 많은 우리가 기계적으로 실행 게다가이 표현과 함께 할 수 없습니다 있습니다. 특히 우리는 오토 마톤을 최소화 할 수없고 두 개의 오토마타가 동등한 지 테스트 할 수 없습니다. 또한이 함수는 상태 및 알파벳 유형의 모든 요소, 즉 S
및 A
을 열거하는 인수 목록을 취해야합니다.
모든 기능을 종료해야하므로 Coq에서 수행하기가 매우 어렵습니다. http://adam.chlipala.net/cpdt/html/Cpdt.MoreDep.html 및 http://www.lix.polytechnique.fr/coq/V8.2pl1/contribs에서 몇 가지 솔루션을 살펴볼 수 있습니다. /Automata.html. 훨씬 간단한 접근법은 함수에 "연료"매개 변수, 즉 인식자가 작동하도록 허용하는 문자 수를 추가하는 것입니다. 그런 다음, 연료가 단어의 길이보다 크거나 같을 때 작동한다는 것을 증명할 수 있어야합니다. – ejgallego
알파벳이 {a, b} 이상의 모든 단어의 언어에 대해'(a | b) *'를 의미합니까? –
[관련] (http://stackoverflow.com/q/897595/2747511) 질문. –