Mikroszámítógép Magazin, 1985/5, pp 14-15
Képletkezelõ programok
(Mathematical Formula Manipulation Systems)
Márk Géza
Mit tud egy képletkezelõ program?
Egyszerûsíteni, összevonni, behelyettesíteni, több
tagot szorozni több taggal, alkalmazni a nevezetes és a trigonometrikus
azonosságokat, differenciálni és esetleg integrálni
is, tehát azokat a mûveleteket képes elvégezni,
amelyeket régebben a középiskolában algebrának
neveztek. Lássunk egy alkalmazási példát. Keressük
egy ellenálláshálózat (1. ábra)
eredõ ellenállását.
|
|
1. ábra. Ellenálláshálózat,
sorosan és párhuzamosan kapcsolt ellenállásokkal
|
Az 1. ábra ellenálláshálózatának
eredõ ellenállása emeletes törttel kifejezve
|
Az R-re kapott képletet begépeljük programunknak:
R := 1/(1/R1 + 1/(R1 + 1/(1/R2+ 1/R3)))
A program válasza:
( Rl**2*R2 + Rl**2*R3 + Rl*R2*R3) / (2*R1*R2
+ 2*Rl*R3 + R2*R3 )
(Itt a hatványozást - a FORTRAN
nyelvhez hasonlóan - két csillag jelöli.) Ha most tudjuk,
hogy például R1= 0.5 Ohm és R3 = 2*R2,
ezt beadhatjuk a programnak, majd megkérdezzük R új
értékét, tehát begépeljük:
R1 := 1/2; R3 := 2*R2; R
A válasz:
(3 + 4*R2) / (12 + 8*R2)
Egy program megírásakor két
dolgot döntünk el: az adatok abrázolási (tárolási)
és feldolgozási módját. Azaz meghatározzuk
a megfelelõ adatszerkezetet és a hozzá illõ
algoritmust.
Adatszerkezet: a kifejezések ábrázolása
fával
A BASIC nyelvben a kifejezéseket egy
karaktersorozattal adjuk meg. Ez hasonlít a képletek szokásos
matematikai írásmódjához. Az ilyen felírást
infix formának nevezzük, mert a mûveleti jelek mindig
a számok vagy változók között állnak.
A FORTH nyelv esetén is karaktersorozattal adjuk meg a kifejezéseket
(ezeket a FORTH kétbájtos címek sorozataként
tárolja), de itt például a 2 + 3 + 4-et így
kell írni: 2 3 + 4 +, vagy 2 3 4 + +. Ez a postfix
forma, a mûveleti jel (operátor) mindig a mûveletben
részt vevõ értékek (operandusok) után
áll. Olyan nyelv is létezik - például a LISP
-, ahol az operátort mindig az operandusok elé kell írni,
például + 2 3. Ez a prefix forma.
Kifejezeskezelésre ezek egyike sem ideális,
mert nem tükrözik a képletek szerkezetét, ezért
célszerûbb a fa szerkezetû ábrázolást
választani. A fának ágai vannak, az ágakból
újabb ágak eredhetnek, azokból még további
ágak, az ágak végén pedig levelek vagy gyümölcsök
ülnek. Egy matematikai képlet abban hasonlít egy ilyen
fára, hogy mindkettõ " önmagába skatulyázott
szerkezetû ". A leveleknek a képletben szereplõ számok
és betûk felelnek meg.
|
2. ábra. Az (A+B)*C kifejezés
ábrázolása fával
|
Az (A + B)*C képletnek megfelelõ
fát mutatja a 2. ábra. Ez egy furcsa fa, mert lefelé
nõ, de így szokták rajzolni. Bonyolultabb példa
a 3. ábra.
|
3. ábra. A másodfokú egyenlet
megoldóképletének ábrázolása fával
|
A fa ábrázolásból egyszerû algoritmussal
visszakapható a képlet BASIC vagy FORTH alakja.
Algoritmus: a helyettesítés
A helyettesítés a kifejezés-fák
kezelésének alapmûvelete. Például adott
a ( 2*(Y + Z)*X )**3 kifejezés, ezt szeretnénk átalakítani
az (A*B)**N = A**N*B**N nevezetes azonosság segítségével.
Ezt megtehetjük, mert olyan a képlet szerkezete, mint az azonosság
bal oldaláé, csak A helyett 2, B helyett
( (Y + Z)*X ), N helyett 3 áll. A 4.
ábra az azonosságot, az 5. ábra pedig a
próbakifejezést szemlélteti. Látjuk, hogy az
azonosság bal oldalát ábrázoló fa ráilleszthetõ
a próbakifejezést ábrázoló fára
(vastag vonallal kihúzott rész), A-nak megfelel 2,
N-nek 3, B-nek pedig az ábrán nem
vastagított rész.
|
4. ábra. A helyettesítési
szabályt ábrázoló két fa
|
|
|
5. ábra. A helyettesítési
szabály illeszkedése a próbakifejezésre
|
6. ábra. A szabály
alkalmazásának eredménye
|
Ha ezeket beírjuk az azonosság jobb
oldalába A, B, N helyére, akkor már
meg is kaptuk a próbakifejezés átalakított formáját
(6. ábra), azaz 2 **3 * ( (Y + Z) *X ) **3-at. Erre
az eredményre még egyszer alkalmazhatjuk az azonosságot,
az azonosság bal oldala a kifejezés egy részfájára
illeszkedik (7. ábra). A-nak az ábrán
külön kiemelt rész, B-nek X, N-nek
3 felel meg. A végeredményt a 8. ábra
mutatja.
|
|
7. ábra. A helyettesítési
szabály illeszkedése egy részfára
|
8. ábra. A szabály
alkalmazásának végeredménye
|
Néhány elnevezés: a helyettesítéshez
használt azonosságot itt helyettesítési szabálynak
hívjuk, utalva arra, hogy csak az egyik irányban kívánjuk
használni (el kell dönteni, hogy éppen beszorozni vagy
kiemelni akarunk, különben a program oda-vissza ismételné
a két mûveletet a végtelenségig). A helyettesítési
szabályban szereplõ betûket (a szabályt ábrázoló
fa leveleit) formális paraméternek nevezzük,
az ezeknek megfelelõ részfák a próbakifejezésben
az aktuális paraméterek.
|
9. ábra. Többtagú összeg
lehetséges fa ábrázolásai
|
Megjegyezzük, hogy egy összeget többféleképpen
rajzolhatunk le fával, mivel az összeadás mûveletét
hallgatólagosan kétargumentumúnak ábrázoltuk
(a BASIC és FORTH nyelveknél is mindig két operandusra
érvényes a " + " jel). Például az A
+ B + C + D kifejezést a 9. ábrán látható
változatok bármelyikével ábrázolhatjuk.
Az egy-egyértelmû ábrázolás az lenne,
amit a 10. ábra mutat.
|
10. ábra. Többtagú összeg
egy-egy értelmû fa ábrázolása
|
Az összeadásnak azt a tulajdonságát,
hogy (A + B) + C = A + (B + C), asszociatív törvénynek
nevezzük. Csakhogy ha így ábrázonánk az
összegeket és szorzatokat, elbonyolódna a helyettesítés
definíciója, ezért most maradunk az eredeti, kétargumentumos
megoldásnál. A fának ezt az önkényes (csak
az ábrázolásból adódó) szerkezetét
a FORTH (postix) forma egyértelmûen megadja, a BASIC (infix)
formában pedig zárójelezéssel írhatjuk
le. Például az elõbbi fák esetén így:
((A+B)+C)+D
|
AB+C+D+
|
(A+B)+(C+D)
|
A B + C D + +
|
A+(B+(C+ D))
|
A B C D + + +
|
A BASIC nyelv - ha nem használunk zárójeleket
- az elsõ formának megfelelõ sorrendben végzi
a mûveleteket, a balról jobbra szabály szerint. Mi is
ezt a felírást hasznaljuk a következõ példában.
Tekintsünk egy nagyon egyszerû
"algebrát", amelyben csak összeadás van, azaz a kifejezések
csak számokból (pozitív vagy negatív számokból),
betûkbõl és " + " jelbõl épülhetnek
fel. Ilyen kifejezés például:
-1 + B + A + 2 azaz:
((-1 + B) + A) + 2
Ennél az "alig-algebránál"
a kifejezések feldolgozása két dolgot jelent: a változók
ABC sorrendbe rendezését és a számok összevonását.
Megadjuk azokat a helyettesítési szabályokat, amelyek
elvégzik ezeket:
1. X + Y -> Y + X
|
ha X szám vagy betû Y
is szám vagy betû és X>Y
|
2. (X + Y) + Z -> (X + Z) + Y
|
ha Y szám vagy betû Z
is szám vagy betû és Y > Z
|
3. N+M -> val( N+M )
|
|
4. (X+N)+M -> X+val( N+M )
|
|
5. X+0 -> X
|
|
Az 1. és 2. szabály biztosítja
a rendezést. A betûk legyenek "kisebbek", mint a számok
(az ASCII kódnál például fordítva van,
a számok kódja a kisebb), így a helyettesítés
a kifejezés végére rendezi a számokat. A 3.,
4., 5. szabályok végzik a számok összevonását,
N és M (pozitív vagy negatív) szám
lehet. A "val" a kifejezés számértékét
jelenti.
Próbakifejezésünk átalakításának
lépései a következõk:
((-1 +B)+A) +2 -> ((B+ -1)+A)+2
|
1. szerint
|
((B+ -1)+A)+2 -> ((B+A)+ -1)+2-->(B+A)+2)+
-1
|
2. szerint
|
((B+A)+2)+ -1 ->((A+B)+2)+ -1
|
1. szerint
|
((A+B)+2)+ - 1 -> (A+B)+ 1
|
4. szerint
|
Többféle mûvelet, bonyolultabb
szabályrendszer esetén is meg lehet próbálni
a kifejezésfeldolgozó algoritmust helyettesítési
szabályok segítségével megadni. De ez azzal
jár, hogy bonyolultabbá válnak a szabályok alkalmazásának
feltételei, és az algoritmus nagyon lassú lesz, mert
minden kifejezésnél és annak minden részkifejezésénél
végig kell vizsgálni az összes szabály alkalmazhatóságát.
Ezért a gyakorlatban közvetlen algoritmusokat használnak
a sûrûn elõforduló mûveletekre: a rendezésre,
összevonásra, differenciálásra stb. Ezek az algoritmusok
"behuzalozva" tartalmazzák az alapmûveletek tulajdonságait
(a nevezetes azonossagokat), így hátrányuk a helyettesítéses
módszerhez képest az, hogy merevebbek annál.
A rendszerek egy része úgy dolgozik,
hogy minden kifejezést egy egységes "kanonikus" formára
alakít (például a betûket mindig ABC-be rendezi,
a hatványokat nagyság szerint, a zárójeleket
felbontja, a törteket közös nevezõre hozza stb.).
Két kifejezést akkor vesz egyenlõnek, ha az egységesítés
után a kifejezéseket egyforma fa ábrázolja:
összevonásnál és egyszerûsítésnél
az egyenlõ kifejezések különbsége nulla,
hányadosa egy.
A mûködõ formulamanipulációs
rendszerek
Egy egyszerûbb képletkezelõ program az alábbi
részekbõl áll:
-
Kifejezések beolvasása és
kiírása, a belsõ ábrázolás (fa)
és külsõ ábrázolás (karaktersorozat)
közötti átalakítás. Kényelmes, ha
a külsõ ábrázolás közel áll
a szokásos matematikai írásmódhoz (törtvonal,
alsó-felsõ indexek).
-
Helyettesítõ algoritmus, változtatható
helyettesítési szabályokkal.
-
Képletegységesítõ
algoritmus. Ennek is többé-kevésbé befolyásolható
a mûködése: "kapcsolók" állításával
meg lehet adni, hogy fel, akarjuk-e bontani a zárójeleket,
ki akarjuk-e fejteni az összegek hatványait stb.
Néhányat felsorolunk a bonyolultabb rendszerek lehetõségei
közül:
-
Számítási program tárolása.
Egy BASIC-hez vagy Pascalhoz hasonló nyelven le lehet írni
a feladat programját; a programban szereplõ változók
értéke vagy egy kifejezés (fa), vagy egy szám.
A számok lehetnek egészek, törtek és lebegõpontos
számok. Általában több száz jegyû
egész számok is alkalmazhatók.
- Vektorok, mátrixok.
- Egyenletek, egyenletrendszerek megoldása.
- Integrálás.
Milyen nyelven célszerû képletkezelõ
programot írni? Jó, ha a nyelv tud fa szerkezetekkel és
rekurzív szubrutinokkal dolgozni. A legelterjedtebb ilyen nyelv az
1960-ban kidolgozott LISP (LISt Processor). A futási idõ és
a szükséges memória nagymértékben függ
az alkalmazott nyelvtõl és algoritmusoktól.
Az elsõ formulamanipulációs
programokat már az ötvenes évek végén megírták.
A fejlõdés fõ ösztönzõje a fizikai
kutatás volt, többek között az égi mechanika
és a relativitáselmélet. Sokszor elõnyösebb
egy eredményt képlet formájában, mint
numerikusan (számok, ábrák alakjában) megkapni,
fõleg, ha az eredmény több változótól
függ. Ezenkívül a numerikus számítást
mindig terhelik a kerekítésbõl adódó
hibák, a hibák hatása pedig néha drasztikus,
és nem is mindig becsülhetõ meg pontosan. A képletkezelés
felhasználja a formális logika eredményeit, szegrõl-végrõl
rokonságban van a tételbizonyító és programhelyesség-bizonyító
rendszerekkel is.
A nagyszámítógépekre
több formulamanipulációs program is létezik: REDUCE, FORMAC, MACSYMA stb. Ezek
egy része hazai számítóközpontokban is hozzáférhetõ.
A gyakorlatban is érdekes feladatok esetén a tárigeny
több száz kbájt, a futási idõ több
perc vagy több óra. Kézzel, papíron a megoldás
általában évekig tartana. A nagygépes rendszerek
legtöbbször nem interaktívak. A "nagygép" kifejezés
persze relatív. A személyi számítógépek
napjainkban elérik azt a teljesítményt, ami a komolyabb
képletkezelõ rendszerek futtatásához kell (16
bites mikroprocesszor, 256 k memória, 10 MHz órajel stb.).
De egy egyszerûbb rendszer akár egy C64 gépen is futhat,
CP/M-re is létezik ilyen program. A formulamanipulációnál
nagy elõny az interaktivitás, mert az ember sokszor csak
a képlet alakítása közben jön rá,
hogy milyen mûveleteket lenne érdemes kipróbálni.
Feladatok
-
Hogyan célszerû ábrázolni
a fa szerkezetet a számítógép memóriájában?
-
Írjuk meg a kifejezéseket fává
(és vissza) alakító programot!
-
Írjuk meg a helyettesítõ
algoritmust!
|