Recitation 002

Paraphrasis matching

fun parenMatch ps =
  let
    fun adjustCounter (x, p) =
      case x of
        NONE => NONE
      | SOME c =>
          case p of
            Paren.L => SOME (c + 1)
          | Paren.R => if c = 0 then NONE else SOME (c - 1)
  in
    Seq.iterate adjustCounter (SOME 0) ps = SOME 0
  end

fun parenMatch ps =
  let
    fun parenMatch' ps =
      case Seq.splitMid ps of
        Seq.EMPTY => (0,0)
      | Seq.ONE Paren.L => (0,1)
      | Seq.ONE Paren.R => (1,0)
      | Seq.PAIR (a, b) =>
          let val ((i,j),(k,l)) =
              Primitives.par (fn () => parenMatch' a,
                              fn () => parenMatch' b)
          in if j <= k then (i+k-j,l) else (i,l+j-k)
          end
  in
    parenMatch' ps = (0,0)
  end

Table of Content