簡體   English   中英

定義有限自動機Coq

[英]Defining a finite automata Coq

我正在學習Coq,我想用它來形式化正則語言理論,特別是有限自動機。 假設我有一個自動機結構,如下所示:

Record automata : Type := {
dfa_set_states : list state;
init_state : state;
end_state : state;
dfa_func: state -> terminal -> state;
}.

其中state是歸納類型:

Inductive state:Type :=
S.

並且類型終端終端是

Inductive terminal:Type :=
a | b.

我正在嘗試定義它以便稍后我將能夠概括任何常規語言的定義。 現在,我想構建一個識別語言(a * b *)的自動機,它是{a,b}字母表上的所有單詞。 有沒有人知道如何構建一些將運行單詞的固定點函數(我將其視為終端列表)並告訴我該自動機是否對該單詞進行了重新划分? 任何想法/幫助都將大大減少。

提前謝謝,埃里克。

因為你將自己局限於常規語言,所以這很簡單:你只需要使用折疊。 這是一個示例:

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的轉換函數,然后測試最后一個狀態是否為接受狀態。

您可以使用此基礎結構來描述幾乎任何常規語言。 例如,這是一個用於識別a*b*的自動機:

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
|}.

我們可以證明這個自動機能達到我們的預期。 這是一個定理,它接受所搜索語言的字符串:

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.

不幸的是,除了運行自動機之外,我們無法用這種表示方式做什么。 特別是,我們不能最小化自動機,測試兩個自動機是否等效,等等。這些函數還需要作為參數列表,枚舉狀態的所有元素和字母類型SA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM