Advertisement
strange012

Untitled

Dec 21st, 2017
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.29 KB | None | 0 0
  1. let rec unify term1 term2 acc =
  2.     match term1 with
  3.     | Atom(x) -> match term2 with
  4.                                 | Atom(y) -> (x=y, acc)
  5.                                 | Variable(y) -> (true, acc + y + " "+x+";")
  6.                                 | _ -> (false, acc)
  7.  
  8.     | Variable(x) -> match term2 with
  9.                                 | Atom(y) -> (true, acc + x + " "+y+";")
  10.                                 | Variable(y) -> (true, acc + x + " "+y+";")
  11.                                 | Structure(n, l) -> (true, acc + x + " "+string(Structure(n, l))+";")  
  12.                                 | _ -> (false, acc)  
  13.  
  14.     | Structure(nx, x) -> match term2 with
  15.                                 | Variable(y) -> (true, acc + y + " "+string(Structure(nx, x))+";")  
  16.                                 | Structure(ny, y) -> if x.Length <> y.Length then (false, acc) else (Seq.zip x y)
  17.                                                                                                                 |> Seq.map(fun s -> unify (fst s) (snd s) "")
  18.                                                                                                                 |> Seq.reduce(fun (s1, s2) (acc1, acc2)-> (s1&&acc1, s2+acc2))
  19.                                 | _ -> (false, acc)  
  20.  
  21.     | _ -> (false, acc)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement