我试图了解如何用forall
Ruby 或 JavaScript 等过程或 OO 语言来实现。例如(这是 Coq):
Axiom point : Type.
Axiom line : Type.
Axiom lies_in : point -> line -> Prop.
Axiom ax : forall (p1 p2 : point), p1 <> p2 ->
exists! l : line, lies_in p1 l /\ lies_in p2 l.
我这样做的尝试只是定义一个诸如此类的类(调用MainAxiom == ax
)。
class MainAxiom
attr :p1
attr :p2
def initialize
raise 'Invalid' if @p1 == @p2
l = Line.new
check_lies_in(l, @p1)
check_lies_in(l, @p2)
end
def check_lies_in(line, point)
...
end
end
这有各种各样的错误。它本质上是说“对于你用点 p1 和 p2 创建的每个公理,它必须满足在一条线上的属性等。”这并不完全符合我的要求。我希望它完成定义实际公理的数学目标。
想知道如何用像 Ruby 或 JavaScript 这样的语言来实现这一点,如果不能直接实现的话,就尽可能接近。即使它只是一个 DSL 或定义一些数据的对象,知道如何作为替代方案也会很有帮助。
让我印象深刻的第一部分是,attr :p1
和 attr 定义似乎适用于每个实例。也就是说,它似乎说了一些关于forall的内容,但我无法确定它。
也许更像这样的东西更接近:
class MainAxiom
# forall p1 and p2
attr :p1 # forall p1
attr :p2 # forall p2
attr :line (p1, p2) -> Line.new(p1, p2)
check_lies_in :p1, :line
check_lies_in :p2, :line
end
我只想让任何东西都接近forall
过程/OO语言的定义。