我试图了解如何以程序或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
定义的一半。
答案 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:
中实现的消息。