我正在遵循“ Handbook of Practical Logic and Automated Reasoning”代码库的Haskell版本。在以下情况下,$form
的目的是什么?
eval :: Formula -> (Rel -> Bool) -> Bool
eval fm v = case fm of
[$form| ⊤ |] -> True
[$form| ⊥ |] -> False
[$form| ^a |] -> v a
[$form| ¬ $p |] -> not (eval p v)
[$form| $p ∧ $q |] -> eval p v && eval q v
[$form| $p ∨ $q |] -> eval p v || eval q v
[$form| $p ⊃ $q |] -> not (eval p v) || (eval q v)
[$form| $p ⇔ $q |] -> eval p v == eval q v
_ -> error "quantifier in prop eval"
相关的OCaml代码很简单:
let rec eval fm v =
match fm with
False -> false
| True -> true
| Atom(x) -> v(x)
| Not(p) -> not(eval p v)
| And(p,q) -> (eval p v) & (eval q v)
| Or(p,q) -> (eval p v) or (eval q v)
| Imp(p,q) -> not(eval p v) or (eval q v)
| Iff(p,q) -> (eval p v) = (eval q v);;
答案 0 :(得分:6)
form
是quasi-quoter。这些提供了一种调用模板Haskell的方式,可以从您希望使用的任何其他语法中生成Haskell代码,例如本例中的Unicode逻辑公式。
从本质上讲,这只是用户可定义的语法糖:在实际编译之前,[$form| ⊤ |]
将被解析为模式Top
,而[$form| $p ∧ $q |]
将被解析为模式And p q
,等等–即基本上与OCaml代码中的内容相同。可以说这对于此功能来说是过大的,但是当生成和/或匹配更复杂的公式时,这肯定会派上用场。
它写成[$form|
而不仅仅是[form|
是过时的GHC-6语法。对于当前的编译器,请使用后一种形式。