Advertisement
Guest User

Untitled

a guest
Mar 13th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 6.17 KB | None | 0 0
  1. let nip str = String.sub str 1 ((String.length str) - 1);;
  2.  
  3. type expr = Var of string | Not of expr | And of (expr * expr) | Or of (expr * expr) | Conj of (expr * expr);;
  4.  
  5. let rec print_expr expr = match expr with
  6.     | Var a       -> a
  7.     | Not a       -> "(!" ^ (print_expr a) ^ ")"
  8.     | And  (a, b) -> "(&," ^ (print_expr a) ^ "," ^ (print_expr b) ^ ")"
  9.     | Or   (a, b) -> "(|," ^ (print_expr a) ^ "," ^ (print_expr b) ^ ")"
  10.     | Conj (a, b) -> "(->," ^ (print_expr a) ^ "," ^ (print_expr b) ^ ")";;
  11.  
  12. let strange = "'";;
  13.  
  14. let rec make_var str have = if String.length str == 0
  15.     then (Var have, str)
  16.     else if String.length str >= String.length strange && String.sub str 0 (String.length strange) = strange
  17.     then make_var (String.sub str (String.length strange) (String.length str - String.length strange)) (have ^ strange)
  18.     else match str.[0] with
  19.     | 'A'..'Z' | '0'..'9' -> make_var (nip str) (have ^ Char.escaped str.[0])
  20.     | _                   -> (Var have, (String.trim str))
  21.  
  22. and make_nnot str = match str.[0] with
  23.     | '!'      -> let (item, str) = make_nnot (String.trim (nip str)) in (Not item, str)
  24.     | 'A'..'Z' -> let (item, str) = make_var  (nip str) (Char.escaped str.[0]) in (item, str)
  25.     | _        -> let (item, str) = make_expr (String.trim (nip str)) in (item, (String.trim (nip str)))
  26.  
  27. and make_aand str = let (item, str) = make_nnot str in
  28.     let rec make_aand_internal str have =
  29.         if String.length str == 0 then (have, str)
  30.         else
  31.         match str.[0] with
  32.         | '&' -> let (item, str) = make_nnot (String.trim (nip str)) in make_aand_internal str (And (have, item))
  33.         | ')' | '|' | '-' -> (have, str)
  34.         | _   -> failwith "Error1"
  35.     in make_aand_internal str item
  36.  
  37. and make_oor str = let (item, str) = make_aand str in
  38.     let rec make_oor_internal str have =
  39.         if String.length str == 0 then (have, str)
  40.         else
  41.         match str.[0] with
  42.         | '|' -> let (item, str) = make_aand (String.trim (nip str)) in make_oor_internal str (Or (have, item))
  43.         | ')' | '-' -> (have, str)
  44.         | _   -> failwith "Error2"
  45.     in make_oor_internal str item
  46.        
  47. and make_expr str = let (item, str) = make_oor str in
  48.     if String.length str == 0
  49.     then (item, str)
  50.     else match str.[0] with
  51.         | '-' -> let (item2, str) = make_expr (String.trim (nip (nip str))) in (Conj (item, item2), str)
  52.         | ')' -> (item, str)
  53.         | _   -> failwith "Error3";;
  54.        
  55. let parse_expr str = let (a, _) = make_expr (String.trim str) in a;;
  56.  
  57. let rec make_context str =
  58.     let (first, str) = make_expr (String.trim str) in
  59.     let str = String.trim str in
  60.     match str.[0] with
  61.         | ',' -> let (lst, str) = make_context str in (first :: lst, str)
  62.         | _   -> ([first], str);;
  63.  
  64. type need = Need of expr list * expr;;
  65.  
  66. let make_first_expr str =
  67.     let (context, str) = make_context str in
  68.     let str = String.trim (nip (nip (String.trim str))) in
  69.     let (expr, _) = make_expr str in Need (context, expr);;
  70.    
  71. let (>>=) x f = match x with
  72.     | Some a -> f a
  73.     | None   -> None;;
  74.  
  75. let takeMon x y = match x with
  76.     | Some a -> a
  77.     | None   -> y;;
  78.  
  79. let rNone x y = None;;
  80. let rNone2 a b y = None;;
  81.    
  82. let checkExpr f1 f2 f3 f4 f5 expr = match expr with
  83.     | Var a       -> f1 a
  84.     | Not a       -> f2 a
  85.     | And  (a, b) -> f3 a b
  86.     | Or   (a, b) -> f4 a b
  87.     | Conj (a, b) -> f5 a b;;
  88. let checkVar (proj, setter) expr took = match proj took with
  89.     | None   -> Some (setter took (Some expr))
  90.     | Some a -> if a = expr then Some took else None;;
  91. let checkNot  f = checkExpr rNone f rNone2 rNone2 rNone2;;
  92. let checkAnd  f = checkExpr rNone rNone f rNone2 rNone2;;
  93. let checkOr   f = checkExpr rNone rNone rNone2 f rNone2;;
  94. let checkConj f = checkExpr rNone rNone rNone2 rNone2 f;;
  95.    
  96. let l1 = (fun (a, _, _) -> a), fun (_, b, c) a -> (a, b, c);;
  97. let l2 = (fun (_, a, _) -> a), fun (a, _, c) b -> (a, b, c);;
  98. let l3 = (fun (_, _, a) -> a), fun (a, b, _) c -> (a, b, c);;
  99.                    
  100. let rec print_expr_ expr = match expr with
  101.     | Var a -> let linz = match a with
  102.         | "A" -> l1
  103.         | "B" -> l2
  104.         | _   -> l3 in checkVar linz
  105.     | Not a       -> checkNot  (print_expr_ a)
  106.     | And  (a, b) -> checkAnd  (fun left right x -> print_expr_ a left x >>= (print_expr_ b right))
  107.     | Or   (a, b) -> checkOr   (fun left right x -> print_expr_ a left x >>= (print_expr_ b right))
  108.     | Conj (a, b) -> checkConj (fun left right x -> print_expr_ a left x >>= (print_expr_ b right))
  109.  
  110. let axioms = List.map (fun x -> print_expr_ (parse_expr x))
  111. (       "A -> B -> A" ::
  112.         "(A -> B) -> (A -> B -> C) -> (A -> C)" ::
  113.         "A -> B -> A & B" ::
  114.         "A & B -> A" ::
  115.         "A & B -> B" ::
  116.         "A -> A | B" ::
  117.         "B -> A | B" ::
  118.         "(A -> B) -> (A -> !B) -> !!A" ::
  119.         "(A -> B) -> (C -> B) -> (A | C -> B)" ::
  120.         "!!A -> A":: []);;
  121.  
  122. let checkAxioms to_check = List.concat (List.mapi (fun ind chain -> let result = chain to_check (None, None, None) in
  123.     match result with
  124.         | Some _ -> [ind]
  125.         | None   -> []) axioms);;
  126.        
  127. print_string (String.concat ", " (List.map string_of_int (checkAxioms (parse_expr "((!U & W) -> (A -> B)) -> ((!U & W) -> (A -> B) -> (G -> R -> T)) -> ((!U & W) -> (G -> R -> T))"))));;
  128.  
  129. type node = Axiom of int | MP of (node * node);;
  130.  
  131. let checkEverything context need evidence =
  132.     let contextSet = Set.empty in
  133.     let rec checkStepByStep haveMap evidenceMap now =
  134.         if Map.mem haveMap now
  135.         then let to_add = takeMon (Map.find_opt evidenceMap now) []
  136.              and smth_to_add = match now with
  137.                 | Conj (a, b) -> if Map.mem haveMap a then [b] else []
  138.                 | _ -> []
  139.              and new_list = now ++ to_add ++ (takeMon (Map.find_opt haveMap b) [])
  140.            
  141.         else None
  142.            
  143. let make_evidence lines = match lines with
  144.     | []                        -> failwith "Error blyat!"
  145.     | first_line :: other_lines ->
  146.         let Need (context, expr) = make_first_expr first_line in
  147.         let other_expr = List.map make_expr other_lines in
  148.         ();;
  149.        
  150.  
  151. print_string "\n";;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement