[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
детерминированными.