如何以程序语言或OO语言实现“ forall”(数学)

时间:2019-03-01 06:44:41

标签: javascript ruby proof formal-methods forall

我试图了解如何以程序或OO语言(如Ruby或JavaScript)实现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定义的一半。

1 个答案:

答案 0 :(得分:1)

如果我被允许在Smalltalk中进行推理,其中块是类BlockClosure的对象,那么我假设您表示要量化为块{{的属性 1}}。

为简单起见,我们假定该属性取决于一个参数p。那么x将对应于Smalltalk表达式

p(x)

使用参数p value: x 计算块p

通过这种方式,您可以在类x中实现Smalltalk方法forAll:

BlockClosure

检查接收方块代表的属性forAll: aCollection aCollection do: [:x | (self value: x) ifFalse: [^false]]. ^true p(您的Universe)中所有元素的评估结果为true

如果您的Universe不变(发生问题时的通常情况),并且属性发生了什么变化,则可以定义类aCollection,该类将在其实例中保存元素集合变量Universe。然后,您可以在contents

中实施
Universe

其中内部forAll: aProperty ^aProperty forAll: contents 消息是在forAll:中实现的消息。