Как сделать сравнение двух функций - PullRequest
0 голосов
/ 06 октября 2011

Я хотел бы знать, как сравнить две функции F(x) & G(x) в SML, которые должны возвращать то же значение, что и f(x)==g(x), где 1<= x <= 100. Например:

- fun f x = x*x;    
val f = fn : int -> int
- fun g x = x+x;
val g = fn : int -> int
- iden f g;
val it = false : bool
- fun f x = x*x;
val f = fn : int -> int
- fun g x = if x<0 then 0 else x*x;
val g = fn : int -> int
- iden f g;
val it = true : bool

1 Ответ

0 голосов
/ 14 октября 2011

Поскольку проверка того, равны ли две функции (программы) для всех входов, не является вычислимой, ваша iden функция, вероятно, должна будет принимать больше параметров, чем просто две функции, которые она сравнивает.

В общем, ваш iden будет:

- fun iden f g elem = f(elem) = g(elem)
val iden = fn : ('a -> ''b) -> ('a -> ''b) -> 'a -> bool

В вашем конкретном случае вы, вероятно, захотите сделать что-то вроде этого:

- fun iden f g = let
=   fun iden_h f g (a, b) =
=     if a > b then iden_h f g (b, a)
=     else if a = b then f(a) = g(a)
=     else f(a) = g(a) andalso iden_h f g (a+1, b)
=  in
=   iden_h f g (1, 100)
=  end
val iden = fn : (int -> ''a) -> (int -> ''a) -> bool
-
- iden (fn x => x + x) (fn x => 2 * x);
val it = true : bool
- iden (fn x => x + x) (fn x => x * x);
val it = false : bool
...