وظيفة الانتقال من Automaton
-
28-09-2019 - |
سؤال
هدفي هو تنفيذ وظيفة انتقالية في OCAML التي تأخذ في إدخال حالة وشخصية تُرجع صيغة منطقية إيجابية (بما في ذلك صواب وخاطئ). هذا هو: Delta (Q0 ، A) = Q1 و (Q2 أو Q3)
مشكلتي هي كيفية تمثيل صيغة منطقية في OCAML وكيفية تنفيذ وظيفة الانتقال مع هذا التحديد
المحلول
بالتناوب الآلي المحدود ، إيه؟
سيتم تمثيل صيغة منطقية بنوع متغير بسيط (سأقوم بإجراء نوع متعدد الأشكال لأنني لا أريد تحديد نوع الحالة حتى الآن):
type ’state formula =
| And of ’state formula list
| Or of ’state formula list
| Literal of bool
| Variable of ’state
لذلك ، على سبيل المثال ، q1 and (q2 or 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 ] ]
| _ -> ...
أو يمكنك اختيار تخزين التحولات في الخريطة (يتيح لك إنشاء Automaton الخاص بك في وقت التشغيل):
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)' */*)
لا تنتمي إلى StackOverflow