[изменить]
Общий вопрос кажется невероятно трудным для решения. Вот значительно ограниченная версия этого вопроса.
Как определить равенство функций?
скажем, что
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
не имеют побочных эффектов, о которых мы заботимся.
[изменить]
Как отметил @Pointy, лучше всего ограничить домен. Вместо этого, имея функцию равенства, попытайтесь угадать домен, пользователь функции равенства должен предоставить домен.
Нет смысла спрашивать, равны ли две функции, не определяя где-то их домен.
Чтобы просто решить проблему, мы можем предположить, что домен является множеством всех целых чисел или подмножеством этого, поэтому нам нужна функция:
function equal (f, g, domain) {
}
Структура домена не имеет значения и может быть сделана, чтобы сделать задачу максимально простой. Вы также можете предположить, что f
и g
действуют красиво в области целых чисел и не сбой и ожог.
Вы можете предположить, что f
и g
halt!
Снова @Pointy указывает хороший пример недетерминированных функций
Что делать, если мы ограничиваем f
и g
детерминированными.