[Редактировать]
Общий вопрос кажется невероятно трудным для решения.Вот весьма ограниченная версия этого вопроса.
Как определить равенство функций?
Допустим, у нас есть
function f() {
// black box code.
}
function g() {
// black box code.
}
Мы берем математическое определение функции.Итак
if for all x in domain, f(x) === g(x) then 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
детерминированностью.