Advertisement
strange012

Untitled

Dec 22nd, 2017
324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.68 KB | None | 0 0
  1.  
  2.  
  3. type PrologTerm =
  4.     | Atom of string
  5.     | Variable of string
  6.     | Structure of string*PrologTerm list
  7.  
  8. let a = Structure("pidory", [Atom("emil");
  9.                                         Atom("jeka")])
  10.  
  11. let b = Structure("pidory", [Variable("E");
  12.                                         Variable("J")])                                  
  13. let unify term1 term2 =
  14.     let rec unify' term1 term2 state acc =
  15.        match term1 with
  16.        | _ when state = false -> (false, [])  
  17.        | Atom(x) -> match term2 with
  18.                                    | Atom(y) -> (x=y, acc)
  19.                                    | Variable(y) -> (true, [(y,x)]@acc)
  20.                                    | _ -> (false, [])
  21.  
  22.        | Variable(x) -> match term2 with
  23.                                    | Atom(y) -> (true, [(x,y)]@acc)
  24.                                    | Variable(y) -> (true, [(x,y)]@acc)
  25.                                    | Structure(n, l) -> (true, [(x,string(Structure(n, l)))]@acc)  
  26.  
  27.        | Structure(nx, x) -> match term2 with
  28.                                    | Variable(y) -> (true, [(y,string(Structure(nx, x)))]@acc)  
  29.                                    | Structure(ny, y) -> if x.Length <> y.Length then (false, []) else (Seq.zip x y)
  30.                                                                                                                    |> Seq.map(fun s -> unify' (fst s) (snd s) state [])
  31.                                                                                                                     |> Seq.reduce(fun (s1, s2) (acc1, acc2) -> (s1&&acc1, s2@acc2))
  32.                                                                                                                     |> fun (s1, s2) -> (s1, s2@acc)
  33.                                     | _ -> (false,[])
  34.     let res = unify' term1 term2 true []
  35.    if (fst res) = false then res
  36.    else  res |> Seq.distinct |>
  37.                    
  38.  
  39. let rec filter (source : (string*string) list) acc =
  40.    let pairs = source |> Seq.filter(fun (s1, s2) -> ['_']@['A'..'Z'] |> Seq.exists (fun x-> x=s2.[0]))
  41.    if (pairs |> Seq.length) <=0
  42.       then acc@source
  43.    else
  44.       let xpair = pairs |> Seq.head
  45.       filter (source |> Seq.map (fun (s1, s2) -> if s2 = (snd xpair) then (s1, fst xpair) else if s1 = (snd xpair) then (fst xpair, s2) else (s1, s2)) |> Seq.distinct |> Seq.filter (fun (s1, s2) ->  ((s1 <> s2) || (s1 <> (fst xpair)))) |> Seq.toList) [xpair]@acc
  46.  
  47. let c = [("A","1");("B","a");("B","A");("C","A");("D","C");("E","a");("F","E");("F","1")]
  48.  
  49.  
  50. filter c []
  51.  
  52. unify (Variable("X")) (Atom("x"))                
  53.  
  54. unify a b
  55.  
  56. ['_']@['A'..'Z'] |> List.exists (fun x-> x='1')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement