【发布时间】:2019-07-23 04:06:22
【问题描述】:
我正在尝试了解如何在 Ruby 或 JavaScript 等过程或 OO 语言中实现 forall。对于example(这是 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
我只想在过程/OO 语言中得到任何接近 forall 定义的东西。
【问题讨论】:
-
你从哪里得到
Line类? -
我只是在写伪代码。
-
很高兴了解您打算如何使用它。现在我可以说,在初始化程序中这一行的简单实例化有点证明它的存在。
标签: javascript ruby proof formal-methods forall