最近我重新开始学习Scala,并用它实现了一个我在函数式或伪函数式语言中经常做的项目:一个命题逻辑(后来扩展到谓词逻辑)的自动推理程序。
现在,我尝试使语言本身的命题逻辑表示尽可能美观,并且通过隐式转换(String -> Atom)已经达到了这个程度:
("A" and "B") implies "C"
"and"和"implies"(以及"or"和"equivalent")函数是调用相关案例类构造函数的简单方法。 然而,当实现"not"时,我陷入了以下两种符号之一:
("A" and "B").not
Not("A" and "B")
有没有办法欺骗Scala接受所期望的内容:
not("A" and "B")
最好不要将类名"Not"更名为"not",因为我将来可能想将其命名为"¬"或其他名称。
unary_not
来获取前缀“not”运算符。 - sepp2kprefix_
只能与!
、~
、+
和-
一起使用。 - sepp2kfoo bar
应该解析成foo.bar()
还是bar.unary_foo()
(即使在两种情况都可能的情况下,你仍然需要规则来决定应该选择哪一个)。 - sepp2k!
而不是not
,请记住 Scala 还允许你定义&&
、||
和->
,因此你不必混合运算符和单词。 - sepp2k