【问题标题】:automata in OCamlOCaml 中的自动机
【发布时间】:2011-04-30 07:25:47
【问题描述】:

我对 OCaml 有点陌生。我想在 OCaml 中实现自动机的产品构造算法。我很困惑如何在 OCaml 中表示自动机。有人可以帮我吗?

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    有限确定性自动机的简洁表示是:

    type ('state,'letter) automaton = {
      initial    : 'state ;
      final      : 'state -> bool ;
      transition : 'letter -> 'state -> 'state ;
    }
    

    例如,判断一个单词是否包含奇数个'a' 的自动机可以这样表示:

    let odd = {
      initial    = `even ; 
      final      = (function `odd -> true | _ -> false) ;
      transition = (function 
        | 'a' -> (function `even -> `odd | `odd -> `even)
        |  _  -> (fun state -> state))
    }
    

    另一个例子是只接受字符串"bbb" 的自动化(是的,这些来自this online handout):

    let bbb = {
      initial = `b0 ;
      final   = (function `b3 -> true | _ -> false) ;
      transition = (function 
        | 'b' -> (function `b0 -> `b1 | `b1 -> `b2 | `b2 -> `b3 | _ -> `fail)
        |  _  -> (fun _ -> `fail))
    }
    

    自动机乘积在数学上被描述为使用状态集的笛卡尔积作为新集,以及最终函数和转移函数在该集上的自然扩展:

    let product a b = {
      initial = (a.initial, b.initial) ;
      final   = (fun (x,y) -> a.final x && b.final y) ;
      transition = (fun c (x,y) -> (a.transition c x, b.transition c y)
    }
    

    这个产品自动机计算两种语言的交集。您也可以使用|| 代替&& 来实现两种语言的联合。

    【讨论】:

    • 哦,非常感谢.. :)我怎样才能将它扩展到 Mealy machine link有限状态传感器 link?我正在尝试将它们组合起来。
    • 有了这样的定义,如何计算给定自动机的状态数?
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多