
22.5. Гомогенизация
Предложение верхнего уровня solve_equationотражает преобразование исходного уравнения в новое уравнение с новым неизвестным. Преобразованное уравнение решается рекурсивно, затем находится решение исходного уравнения.
solve_equation(Equation, X, Solution)
homogenize(Equation, X, Equation 1, X 1),
solve_equation (Equation1, X1, Solution1),
solve_equation (Solution 1, X, Solution).
Тело правила для предиката homogenize/4реализует четыре этапа гомогенизации, описанные в разд. 22.1.Множество представителей вычисляется предикатомoffenders/3,который проверяет наличие в этом множестве нескольких элементов. Если в множестве только один элемент, то гомогенизация бесполезна:
homogenize (Equation, X, Equation 1, X 1)
offenders (Equation, X, Offenders),
reduced_term (X, Offenders, Type, XI),
rewrite (Offenders, Type, X1, Substitutions),
substitute (Substitute, Equation, Equation!).
Предикат reduced_term/4находит некоторыйприведенный терм,рассматриваемый далее в качестве нового неизвестного. Для организации поиска приведенного терма определяется тип уравнения. Этот тип используется на следующем этапе для поиска правила преобразования, выражающего каждый элемент множества представителей в виде функции приведенного терма. Уравнение, рассматриваемое в качестве примера, имеет экспоненциальный тип. В комплексе PRESSиспользуется много эвристических правил поиска подходящего приведенного терма. Эти эвристики зависят от типа термов, входящих в множество представителей. Для облегчения процесса поиска приведенного терма выделяются два этапа: классификация множества представителей по типу и нахождение приведенного терма данного типа:
reduced_term(X, Offenders, Type, XI)
classify (Offenders, X,Туре),
candidate (Type, Offenders, X, X1).
Как видно, множество правил соответствует рассматриваемому нами уравнению. Множество представителей относится к экспоненциальному типу, поскольку все элементы в нем имеют вид AB,гдеАне содержит, аВсодержит неизвестное. Истинность этого проверяется стандартными рекурсивными процедурами.
Эвристика, испотьзуемая в этом примере
для выбора приведенного терма,
формулируется так: если все термы
рассматриваемого множества имеют
одинаковое основание А, а каждый
показатель степени представляет собой
полином от неизвестного X,то подходящим приведенным термом
является терм A•.
candidate(exponential, Offenders,А, А X)
base(Offenders, A),
polynomial_exponents(Offenders,X).
Простые программы для предикатов baseи polynomial_exponenisсодержатся в полном тексте программы решателя уравнений. В комплексе PRESSреализованы более тонкие эвристики. Например, может быть вычислен наибольший общий делитель всех старших членов полиномов и использован для выбора приведенного терма.
Следующий шаг состоит в проверке того, может ли каждый элемент множества представителей быть выражен через предлагаемый приведенный терм. Это требует поиска соответствующего правила. Набор предложений homogenize_axiomсодержит возможные правила преобразования. Другими словами, подходящие правила должны быть специфицированы заранее. В рассматриваемом примере применимыми являются следующие правила:
homogenize_axiom(exponentia1,A (N*X), AX, (A X) N).
homogenize_axiom(exponential,A (X + B),A X,A B*A X).
Подстановка терма в уравнение отражает процесс разбора, использующий предикат offenders,так как проверяется каждая часть уравнения с целью определения в ней терма, подлежащего замене.
Упражнения к гл. 22
1.Добавьте в программу 22.1аксиомы изоляции для обработки отношений в левой части уравнения. Решите уравнениех/2 = 5.
2.Измените решатель
алгебраических уравнений так, чтобы с
его помощью можно было решать
замаскированные линейные и квадратные
уравнения. Решите уравнения
2x-8=x
и.x4-5x2+6=0.
3.Уравнение cos(2x)-sin(х)=0может быть решено как квадратное уравнение с неизвестным sin(x).Данное уравнение приводится к квадратному с помощью подстановкиcos(2x)=1-2sin2(х).Добавьте в программу 22.1предложения для решения этого уравнения. При этом необходимо добавить правила для идентификации термов типа trigonometric. эвристики для поиска приведенных тригонометрических термов и соответствующие аксиомы гомогенизации.
4.Перепишите предикат free_of(Term, X)так, чтобы он принимал значение «ложь» при обнаружении вхожденияХв терм Term.
5.Измените программу 22.1так, чтобы она решала простые системы уравнений.