Равны ли две функции?

[Edit]

Общий вопрос кажется невероятно трудным для решения. Вот значительно ограниченная версия этого вопроса.


Как определить равенство функций?

Допустим, у нас есть

function f() {
    // black box code.
}

function g() {
    // black box code.
}

Мы берем математическое определение функции. Итак

если для всех x в домене f (x) === g (x), то f === g

  • Как мы обрабатываем домены?
  • Как иначе мы можем определить, что f === g

Проверки по исходному коду - это глупо, потому что

function f(i) {
     return i % 2;
}

function g(i) {
     var returnVal = i % 2;
     return returnVal;
}

явно равны. Это тривиальные примеры, но вы можете представить себе более сложные функции равными, но не равными по источнику.

Вы можете предположить, что f и g не имеют побочных эффектов, о которых мы заботимся.


[Edit]

Как упоминал @Pointy, вероятно, лучше всего ограничить домен. Вместо того, чтобы функция равенства пыталась угадать домен, пользователь функции равенства должен указать домен.

Нет смысла спрашивать, равны ли две функции, не определяя где-нибудь их домен.

Чтобы просто решить проблему, которую мы можем предположить, домен - это набор всех целых чисел или их подмножество, поэтому нам нужна функция :

function equal (f, g, domain) {

}

Структура домена не имеет значения, и ее можно сделать так, чтобы проблема была как можно проще. Вы также можете предположить, что f и g хорошо действуют в области целых чисел и не вызывают сбоев и горят.

Вы можете предположить, что f и ] g стой!

И снова @Pointy указывает на хороший пример недетерминированных функций

Что, если мы ограничим f & g детерминированными.

12
задан Community 23 May 2017 в 10:28
поделиться