PageRenderTime 42ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/DkalBackends/DatalogTranslator/Utils.fs

http://dkal.codeplex.com
F# | 79 lines | 67 code | 10 blank | 2 comment | 9 complexity | 9107dc57556bfb4fb3b829acb0fe40b1 MD5 | raw file
Possible License(s): Apache-2.0, GPL-3.0, LGPL-3.0, BSD-3-Clause
  1. namespace Microsoft.Research.DkalBackends.DatalogBackend.DatalogTranslator
  2. open System
  3. open System.Collections.Generic
  4. open Microsoft.Research.DkalBackends.Ast
  5. open Datalog
  6. module Utils =
  7. let rec stripPrefixedFormula (f: PrefixedInfonFormula) =
  8. match f with
  9. | AtomPrefixedFormula(p, r, ts) -> AtomFormula(r, ts)
  10. | AndPrefixedFormula(p, pi1, pi2) -> AndFormula(stripPrefixedFormula(pi1), stripPrefixedFormula(pi2))
  11. | ImpliesPrefixedFormula(p, pi1, pi2) -> ImpliesFormula(stripPrefixedFormula(pi1), stripPrefixedFormula(pi2))
  12. | SpeechPrefixedFormula(p, ppal, speech, pi) -> SpeechFormula(ppal, speech, stripPrefixedFormula(pi))
  13. let rec prefixedFormula (p: Prefix) (f: InfonFormula) =
  14. match f with
  15. | AtomFormula(r, ts) -> AtomPrefixedFormula(p, r, ts)
  16. | AndFormula(f1, f2) ->
  17. let pf1 = prefixedFormula p f1
  18. let pf2 = prefixedFormula p f2
  19. AndPrefixedFormula(p, pf1, pf2)
  20. | ImpliesFormula(f1, f2) ->
  21. let pf1 = prefixedFormula p f1
  22. let pf2 = prefixedFormula p f2
  23. ImpliesPrefixedFormula(p, pf1, pf2)
  24. | SpeechFormula(ppal, speech, f1) ->
  25. let pf1 = prefixedFormula (SpeechPrefix(p, ppal, speech)) f1
  26. SpeechPrefixedFormula(p, ppal, speech, pf1)
  27. let rec prefixLength (p: Prefix) =
  28. match p with
  29. | EmptyPrefix -> 0
  30. | SpeechPrefix(p, _, _) -> 2 + prefixLength p
  31. let rec matterLengths (pf: PrefixedInfonFormula) =
  32. match pf with
  33. | AtomPrefixedFormula(p,_,ts) -> (prefixLength p, ts.Length)
  34. | AndPrefixedFormula(p,f1,f2) ->
  35. let _, m1 = matterLengths f1
  36. let _, m2 = matterLengths f2
  37. (prefixLength p, m1 + m2)
  38. | ImpliesPrefixedFormula(p,f1,f2) ->
  39. let _, m1 = matterLengths f1
  40. let _, m2 = matterLengths f2
  41. (prefixLength p, m1 + m2)
  42. | SpeechPrefixedFormula(p,_,_,f1) ->
  43. let _, m1 = matterLengths f1
  44. (prefixLength p, 2 + m1)
  45. let rec prefixFormMatter (p: Prefix) =
  46. match p with
  47. | EmptyPrefix -> EmptyPrefix, []
  48. | SpeechPrefix(p', ppal, speech) ->
  49. let pf, pm = prefixFormMatter p'
  50. (SpeechPrefix(pf, AnyTerm, AnySpeech), pm @ [MatterTerm ppal; MatterSpeech speech])
  51. // function to obtain a list of Datalog arguments declaration from a formula matter
  52. let matterToDatalogArgumentsDeclaration (pm, fm) =
  53. let args = List<string * Sort>()
  54. for me in pm @ fm do
  55. match me with
  56. | MatterSpeech(_) -> args.Add("x"+args.Count.ToString(), "Q")
  57. | MatterTerm(_) -> args.Add("x"+args.Count.ToString(), "C")
  58. args
  59. // function to obtain a list of Datalog terms from a formula matter
  60. let matterToDatalogTerms (pm, fm) =
  61. let args = List<Term>()
  62. for me in pm @ fm do
  63. match me with
  64. | MatterSpeech(AnySpeech) -> failwith "impossible"
  65. | MatterSpeech(s) -> args.Add(AtomTerm(s.ToString()))
  66. | MatterTerm(AnyTerm) -> failwith "impossible"
  67. | MatterTerm(Microsoft.Research.DkalBackends.Ast.VarTerm(v, t)) -> args.Add(VarTerm(v))
  68. | MatterTerm(ConstTerm(c, t)) -> args.Add(AtomTerm(c))
  69. args