Здесь происходит несколько вещей. (1) Помните, что «:» является оператором присваивания; «=» означает уравнение или равенство, а «: =» - определение функции. Для f
и g
возможно получить работоспособное решение, используя «:» или «: =»; Я покажу оба ниже.
(2) Правая часть определения функции в «: =» не оценивается (или даже упрощается), поэтому, когда вы пишете h(x, y) := quotient(...)
, частное не оценивается, а определение h
содержит вызов quotient
. Когда вы звоните h(0, 0)
, у вас будет quotient
, оцененное с x = 0 и y = 0, что дает число вместо символического выражения.
Полагаю, что вам нужно определить функцию h
так, чтобы h(x, y)
являлось частным f
и g
, оцененным в x
и y
. Если это так, вот решение, использующее «:» для f
и g
.
f : x*y;
g : x;
define (h(x, y), quotient(f, g));
define
вычисляет тело функции (второй аргумент), поэтому частное выполняется до определения функции.
Максимум в основном предпочитает выражения, но можно также определить f
и g
как функции здесь.
f(x, y) := x*y;
g(x, y) := x;
define (h(x, y), quotient(f(x, y), g(x, y)));
Я знаю, что это немного сбивает с толку, поскольку есть несколько способов сделать это.