Я пытаюсь понять, как реализовать forall
на процедурном или OO-языке, таком как Ruby или JavaScript.Для пример (это 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-языке.