subDef :: Def
subDef =
    Def "sub" ["a", "b", "q105"] (
      ((V "b" === C "o" []) &&&
      (V "a" === V "q105")) |||
      (fresh ["y"] (
        (V "b" === C "s" [V "y"]) &&&
        (((V "a" === C "o" []) &&&
        (V "q105" === C "o" [])) |||
        (fresh ["x"] (
            (V "a" === C "s" [V "x"]) &&&
            (call "sub" [V "x", V "y", V "q105"]))))))
    )
subDef :: Def
subDef =
    Def "sub" ["a", "b", "q105"] (
      ((V "b" === C "o" []) &&&
      (V "a" === V "q105")) |||
      (fresh ["y"] (
        (V "b" === C "s" [V "y"]) &&&
        (((V "a" === C "o" []) &&&
        (V "q105" === C "o" [])) |||
        (fresh ["x"] (
            (V "a" === C "s" [V "x"]) &&&
            (call "sub" [V "x", V "y", V "q105"]))))))
    )
subDef =
    Def "sub" ["a", "b", "q105"] (
      ((V "b" === C "o" []) &&&
      (V "a" === V "q105")) |||
      (fresh ["y"] (
        (V "b" === C "s" [V "y"]) &&&
        (((V "a" === C "o" []) &&&
        (V "q105" === C "o" [])) |||
        (fresh ["x"] (
            (V "a" === C "s" [V "x"]) &&&
            (call "sub" [V "x", V "y", V "q105"]))))))
    )