Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 自动机的转移函数_Functional Programming_Ocaml_Automaton - Fatal编程技术网

Functional programming 自动机的转移函数

Functional programming 自动机的转移函数,functional-programming,ocaml,automaton,Functional Programming,Ocaml,Automaton,我的目标是在OCaml中实现一个转换函数,它接收一个状态输入,一个字符返回一个正布尔公式(包括true和false)。 即:\delta(q0,a)=q1和(q2或q3) 我的问题是如何在ocaml中表示布尔公式,以及如何用这个特定的交替有限自动机实现转换函数,嗯 表示布尔公式将使用一个简单的递归变量类型(我将把它转换为多态类型,因为我还不想指定状态的类型): 因此,例如,q1和(q2或q3)将表示为: And [ Variable q1 ; Or [ Variable q2 ; Variabl

我的目标是在OCaml中实现一个转换函数,它接收一个状态输入,一个字符返回一个正布尔公式(包括true和false)。 即:\delta(q0,a)=q1和(q2或q3)


我的问题是如何在ocaml中表示布尔公式,以及如何用这个特定的

交替有限自动机实现转换函数,嗯

表示布尔公式将使用一个简单的递归变量类型(我将把它转换为多态类型,因为我还不想指定状态的类型):

因此,例如,
q1和(q2或q3)
将表示为:

And [ Variable q1 ; Or [ Variable q2 ; Variable q3 ] ]
您可以将函数表示为实际的OCaml函数:

type state = Q0 | Q1 | Q2 | Q3
let delta : state * char -> state formula = function 
  | Q0, 'a' -> And [ Variable Q1 ; Or [ Variable Q2 ; Variable Q3 ] ]
  | _ -> ...
或者,您可以选择将转换存储在映射中(这允许您在运行时构建自动机):


是的,是交替有限自动机,谢谢你们的回答,最后一件事:若你们不知道状态的数量,我该怎么办?使用第二种解决方案,给每个状态一个数字(因为状态被编码为整数,你们可以有任意数量的状态)。
type state = Q0 | Q1 | Q2 | Q3
let delta : state * char -> state formula = function 
  | Q0, 'a' -> And [ Variable Q1 ; Or [ Variable Q2 ; Variable Q3 ] ]
  | _ -> ...
type state = int

module OrderedStateChar = struct
  type = state * char
  let compare = compare
end

module StateCharMap = Map.Make(OrderedStateChar)  

let transition_of_map map = 
  fun (state,char) -> 
    try StateCharMap.find (state,char) map 
    with Not_found -> Literal false

let map = List.fold_left 
  (fun map (state,char,formula) -> StateCharMap.add (state,char) formula map)
  StateCharMap.empty 
  [ 
    0, 'a', And [ Variable 1 ; Or [ Variable 2 ; Variable 3 ] ] ;
    ...
  ]

let transition = transition_of_map map

let _ = transition (0,'a') (*/* returns '1 and (2 or 3)' */*)