Перейдем теперь к решению второй задачи межпроцедурного анализа - описанию входных и выходных данных подпрограммы в терминах фактических параметров. Описываемый здесь метод опирается на [9,16] и требует, чтобы входные и выходные данные подпрограммы уже были описаны в виде системы линейных неравенств.
Пусть в программе есть две подпрограммы P и Q, такие, что:
SUBROUTINE P(...)
DIMENSION Ap(lp1:up1,...,lpp:upp)
...
CALL Q(...,Ap(op1,...,opp),...)
...
END
SUBROUTINE Q(...,Aq,...)
DIMENSION Aq(lq1:uq1,...,lqq:uqq)
...
END
Пусть элементы массива Aq, представляющие часть входных и выходных данных подпрограммы Q, представлены в виде области Wq, описанной с помощью набора линейных равенств и неравенств. Требуется пересчитать эту область в терминах вырезки из соответствующего фактического параметра-массива Ap.
Запишем условие Гpq того, что два элемента массивов Ap(y1,..., yp) и Aq(j1,..., jq) ссылаются на одну и ту же область памяти:
где .
Тогда пересечение трех областей W=WqÇГpqÇ{lpi£yi£upi, i =1,p} неявно задает область Wp массива Ap, соответствующую области Wq массива Aq. Для получения явного описания Wp необходимо получить проекцию (p+q)-мерной области W на p-мерное подпространство, соответствующее массиву Ap. Это можно сделать с помощью исключений Фурье-Моцкина [12,13], если равенство Гpq линейно. Определение условий его линейности рассматривается дальше.
Если равенство Гpq нелинейно, то при некоторых условиях можно получить более простое условие. Если массивы Ap и Aq имеют одинаковое число элементов в первых (d-1) размерностях (то есть {upi - lpi = uqi - lqi, 1 £ i £ d-1}), и {opi=lpi, 1 £ i £ d-1}, то добавим в описание области W равенства {yi - lpi=ji - lqi, 1 £ i £ d-1} и составим частичное уравнение ранга d:
|
где .
Это уравнение проще, чем Гpq, и в реальных случаях может оказаться линейным, в то время как полное уравнение таковым не является. Если количество размерностей с одинаковым числом элементов равно q, но меньше p, то в описание области W вместо условия Гdpq нужно добавить равенства {yi=opi, | i=q+1,p }.
Для того, чтобы получить проекцию (p+q)-мерной области W на p-мерное пространство, необходимо исключить переменные, введенные для описания Wq, из всех равенств и неравенств. Это можно сделать методом Фурье-Моцкина [12,13], если все ограничения, содержащие эти переменные, линейны. Так как в описание Wq входят только линейные ограничения, нелинейность по данным переменным может возникнуть только в равенстве Гpq (Гdpq). Кроме того, для проведения дальнейшего анализа программы важно, чтобы все получающиеся ограничения также были линейными. Поэтому нужно выделить условия на внешние переменные, при которых Гpq (Гdpq) будет линейным по всем переменным.
Для этого берем равенство Гpq (Гdpq), приводим в нем подобные, после чего приравниваем к нулю все нелинейные части. Если из получившихся равенств можно выразить переменные, введенные для описания Wq, через внешние переменные, и подстановка этих выражений в ограничения вместо переменных не входит в противоречие с заданными ограничениями на внешние переменные, то добавим к равенству Гpq (Гdpq) с зануленными нелинейными частями ограничения {lpi£yi£upi|1£i£p} и {lqi£ji£uqi|1£i£q}. После этого исключаем из получившихся линейных ограничений все переменные, кроме внешних, и получаем искомые ограничения на внешние переменные.
|