繁体   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