LOGIKAI A L A P Ú PROGRAMOZÁSI M Ó D S Z E R E K ËS A L K A L M A Z Á S A I K S Z Á M Í T Ó G É P P E L S E G Í T E T T É P Í TÉSZETI TERVEZÉSI
F E L A D A T O K M E G O L D Á S Á H O Z
Irta :
MÁRKUSZ ZSUZSANNA
Tanulmányok 124/1981
ISBN 963 311 121 8 ISSN 0324 2951
1. BEVEZETES. . . 5 2. A LOGIKAI PROGRAMOZÁS ÉS AZ ÉPÍTÉSZETI CAD íe 2.1. A PROLOG RÖVID I S M E R T E T É S E . . . 16 2.2. A PROLOG S A J Á T O S S Á G A I N A K F E L H A S Z N Á L Á S A
A Z É P Í TÉSZETI T E R V E Z É S M O D E L L E Z É S É B E N 19 2 .2.1
Paneles lakásalaprajz variációkattervező program ... 21
2 .2.2
Programozási elvek, megoldások,f o g á s o k
. . . 32
3. LOGIKAI ALAPÚ PROGRAMOK KOMPLEXITÁSA . . . 48 3.1. A K O M P L E X I T Á S S Z Á M Í T Á S . . .
483.2. P R I M L O G - A PROLOG EG Y M E G S Z O R Í T Á S A • 52
3.3. L O K Á L I S ÉS G L O BÁLIS K O M P L E X I T Á S M U T A
T Ó K B E V E Z E T É S E . . . 6 3
3.3.1. A program tervezés komplexitása,
szemantikus hibák ... 63 3.3.2. PROLOG programok komplexitás
m é r t é k e i ... 6 7 3.3.3. A komplexitás mutatók alkalmazá
sa egy CAD program három válto
zatának kiértékeléséhez . . . . 71
A. A LOGIKAI PROGRAMOZÁS ALKALMAZÁSA TÖBBSZIN
TES LAKÓÉPÜLET TERVEZÉSI RENDSZERÉHEZ . . . 75
A.l. A P R O G R A M F E L A D A T A . . . 75
A.2. A L A K Ó É P Ü L E T TERVEZÉSI REN D S Z E R E /
A D A T B Á Z I S / S T R U K T Ú R Á K . . . 76
O L D A L
4.3, A P R O G R A M R E N D S Z E R RÉSZEI . . . 81
4.3.1. Egyéni igényeket kielégitó lakás
alaprajz variációkat tervező prog
ram /FLAT/ ... 82 4.3.2. A lakás variációk prioritási sor
rendjének kialakítását végző prog
ram / O R D / ... 85 4.3.3. A tervezendő épület vertikális szer
kezetét kialakitó program /BUILD/ 86 4.3.4. A lakóépület szintenkénti alapraj
zi elrendezését tervező program
/ T O T A L / ... ... 86
4.4, FUTÁSI A D A T O K . . . Ю О
4.5, A P R O G R A M R E N D S Z E R K O M P L E X I T Á S A . . . Ю 4
5. ÖSSZEFOGALALÁS. . . ю ?
6, IRODALMOJEGYZÉK. . . n o
1. BEVEZETÉS
A tanulmány tárgya a számitógéppel segített építésze
ti tervezés egy alapjaiban u j , a matematikai logika eszközeit használó módszere, és annak alkalmazása. A PROLOG uj elvű, logikai alapú programozási nyelv se
gítségével kidolgoztuk többszintes lakóépületek terve
zésének modellezését, számítógéppel megoldottunk eddig nem formalizált építészeti bonyolultságának vizsgálatá
val pedig olyan programozás-módszertani elveket fej
lesztettünk ki, amelyek hatékonyan alkalmazhatók a g y a korlati programozási munkában.
A bevezetés további részében a tárgykört érintő alap
fogalmakról írunk, ismertetjük az eddig elért legfon
tosabb eredményeket. A második fejezetben megmutatjuk, hogy mit és miért lehet PROLOG-ban programozni a szá
mítógéppel segitett építészeti tervezés területén, a harmadikban pedig azt, hogy hogyan érdemes. A negyedik
fejezetben ismertetünk egy, a gyakorlati igényeket k i e légítő komplex programrendszert.
* * *
A бо-as években a hardware eszközök rohamos fejlődésé
vel párhuzamosan egyre összetettebb, magasabbrendu tu
dásreprezentációt és feladat-megoldó képességet kíván
tak a számitógépre ráruházni, ami a rendelkezésre álló software eszközök segítségével igen nehézkesnek, néhol lehetetlennek bizonyult. Ezért Nyugat-Európa és az Egyesült Államok több számítástudományi központjában kezdtek el dolgozni olyan emberközeli, "nagyon magas szintű" (új elvű) programozási nyelvek definiálásán és megvalósitásán, amelyek alapjaiban különböznek a hagyományos algoritmikus nyelvektől. Â PROLOG ilyen új elvű, a mesterséges intelligencia kutatások kere
tein belül kifejlesztett programozási nyelv.
Az új elvű programozási nyelvekkel szemben támasztott követelményeket a következő öt pontban foglaljuk össze
[47]:
1. Az új elvű programozási nyelven csak a lényeget kelljen megfogalmazni, vagyis a nyelv adjon lehető
séget arra, hogy a programozó csak a számára lényeges kérdéseket döntse el, és a lényegteleneket hagyja nyitva - a "mit" kényelmes megfogalmazása;
2. A nyelv biztosítson lehetőséget a programozónak arra, hogy a megoldás algoritmusára vonatkozó m ó d szertani, azaz vezérlési információkat adhasson - lehetőség a "hogyan" megadására;
3. A fenti két funkció ne keveredjen, azaz világosan elkülöníthető legyen a feladat definiálása, a "mit"
és a megoldás algoritmusa a "hogyan".( A jelenleg elterjedt algoritmikus nyelveknél pl. ALGOL, FORTRAN, P L /1 ez a két funkció teljesen összeolvad. A prog
ramozó a megoldás algoritmusán keresztül definiálja a megoldandó problémát.);
4. A nyelvnek legyen explicit, precizen definiált, matematikai eszközökkel jól kezelhető szemantikája;
5. A nyelv legyen "hivatkozási átlátszó", azaz a nyelv szintaxisa megfelelően tükrözze a szemantikát, azaz a "jelentés" minden árnyalatát.
Több ilyen új elvű, vagy "nagyon magas szintű" nyelv született, amelyek közül a legjelentősebbek az USA-ban elterjedt LISP alapú nyelvek, a lambda kalkulusra épü
lő QLISP [42], PLANNER [3], QA4 [9], POPLER [8], és az Európábam kidolgozott logikai alapú nyelvek, mint a ABSYS [lo}, ABSET [11], és a PROLOG.
A LISP alapú nyelvek kissé nehézkes szintaxis-sal ren
delkeznek, nincs mindegyiknek kellő pontossággal defi
niált szemantikája, s alkalmazási területeik is jobbá
ra a mesterséges intelligencia kutatások keretei között m a r a d t a k .
A legsikeresebb, és a legigéretesebb uj elvű nyelvek a PLANNER és a PROLOG.
A PROLOG a matematikai logika legjobban kidolgozott nyelvére, az elsőrendű predikátum kalkulusra épül.
Egy PROLOG Droaram speciális elsőrendű formulák, a u.n. Horn-klózok halmaza, igy a nyelv szintaxisa a predikátum kalkulus szintaxisának egy leszűkitése, és szemantikája precízen definiált. A PROLOG egy olyan programozási nyelv, amely szinte teljesen ele
get tesz az új elvű nyelvekkel szemben támasztott a fent emlitett öt pontban összefoglalt követelmények
nek. Alkalmazási területe egyre szélesedő, kérdés
válasz rendszerek, programgenerálás, természetes nyelv megértés feladatain kivül egyre több műszaki alkal
mazásával is találkozhatunk. [7, 29, 3o, 31, 43].
Azok a feladatok, amelyekre nem komplikált matematikai formulák kiszámítása, hanem a logikai döntések soro
zata jellemző (pl. meghatározott funkcionális és struk
turális igényeket kielégítő lakásalaprajz tervezése), tömören és pontosan megfogalmazhatók a logika nyelvén«
Éppigy leirható a feladat világa is, amely azon adott
ságok és követelmények rendszere, amelyeket figyelembe kell Csenni a feladat megoldása során. A feladat világát axiómákkal, ill, definíciókkal lehet megadni, míg maga a feladat bizonyítandó tételnek fogható fel. Az igy kialakított rendszer elsőrendű predikátum kalkulusban megfogalmazva alkotja magát a számitógépes programot.
Tehát egy feladat kijelölése és a feladat világának kellő pontosságú logikai definiálása elegendő a számitógépes program Írásához. Ez azonban még csak a probléma megol
dás "mit" része. A "hogyan", tehát a feladatmegoldás
algoritmusának megadásához is segítséget nyújt a logika eszköztára. A logikai állításokon működő következtetési szabályokat a számitógép számára érthetővé tették, a nyelv interpreterébe vagy fordítójába beépítették. A feladat megoldását áz igy kialakított automatikus kons
truktiv tételbizonyitási eljárás állitja elő. S mivel az elsőrendű predikátum kalkulushoz van teljes követ
keztetési szabályrendszer (a PROLOG esetében a lineá
ris stratégiával ellátott u.n. rezoluciót használják) a tételbizonyitási eljárás matematikai logikai háttere is megalapozott.
A PROLOG elméleti alapjait R. Kowalski, M. Emden és L.
Colmerauer dolgozták ki [21, 22, 5]. Az ötletet először 1974-ben, Marseille-ben implementálták [2], később Edinburgh-ban [45, 46], majd 1975-ben Budapesten, a NIM Ipargazdasági és Üzemszervezési Intézet ICL 19o5/A
tipusu számitógépén is megvalósitották. Azóta újabb és gyorsabb változatok működnek több magyar számitóközpont SIEMENS 7.7.55 ICL System 4-7o, IBM 3o31 és R-2o tipusu gépein [44, 23, 43].
A PROLOG programozási nyelv implementálásával lehetőség nyílt olyan összetett feladatok gyors, számitógépes meg
oldására, amelyek nagyon nehézkeseknek bizonyultak a hagyományos algoritmikus programozási nyelveken. Ide tartozik az építészeti tervezés modellezésével kapcso
latos néhány CAD probléma is.
Az építészeti tervezés modellezése alatt azt a tevé
kenységet értjük, amellyel formalizáljuk azokat a meggouau lásokat, amelyeket egy tervező mérnök végez, mi k ö z
ben egy meghatározott funkciót ellátó épület terét kitöltő egységek méreteit, funkcionális kapcsolatait, közlekedési lehetőségeit, különböző szerkezeti szem
pontokat kielégítő elrendezési sémáját kialakítja.
Az építészeti tervezés olyan bonyolult, sok komponens
ből összeálló kreativ szellemi munka, hogy teljes for
malizálását, illetve automatizálását nem tudjuk, de nem is akarjuk megvalósítani. Célunk lehet azonban számitógépes rendszerek létrehozása, amelyek a tervező mérnök munkáját segitik, hatékonyabbá teszik. Az ilyen számitógéppel segitett tervezés (az angol elnevezésből
"Computer Aided Design" rövidítve: CAD) alapvető prob
lémája a munkamegosztás az ember és a gép között. A használt számitógép kapacitásától, a meglévő hardware és software eszközök színvonalától függ, hogy mely tervezési szakaszokat biznak a számitógépre és melyek
hez szükséges a tervező mérnök döntése.
A nemzetközi szakirodalomban publikált építészeti CAD rendszerek közös vonása, hogy a tervezői munka teljes folyamatából kiemelnek egy vagy több szakaszt, s ezek számitógépes automatizálásával foglalkoznak. A számitó
géppel segitett építészeti CAD rendszerekkel foglalkozó szakirodalom a következő témák szerint csoportosítható:
1. Automatikus terület felosztási probléma [39, 15, 28];
2. A képi reprezentáció által felvetett önálló grafikai problémák, mint a három-dimenziós testek takartvonalas ábrázolása, perspektivikus ábrázolás kérdései stb.
[27, 37, 34];
3. Mérnöki rajzok, vázlatok számitógépes feldolgozása, digitalizálása [25, 48, 41];
4. Az építészeti tervezés dokumentációjához szükséges műszaki rajzok automatikus elkészítése, és a gazda
sági számítások elvégzése [16, 24, 4];
5. Az építészeti tervezés általános aspektusainak elem
zése, a kialakítandó integrált CAD rendszer elvi fel
építése [1, 12];
6. A matematikai logikán alapuló uj software eszközök,(p l . QLISP, PROLOG) és formális rendszerek (pl. FUZZY hal
mazok) alkalmazása különböző CAD feladatok megoldásához [13, 26, 43, 29, 3o, 31, 32] .
C.M. Eastman a "The Representation of Design Problems"
[12] c. cikkében az ember-gép kapcsolat két alapvető módszerét különbözteti meg. Az egyik fajta kapcsolat a mérnöki tudást a rajzokon, vázlatokon keresztük kivánja a számitógép számára átadni és érthetővé tenni. Ez ter
mészetesen sok speciális alakfelismerési problémát vetett fel, amelyek megoldása legalább olyan nehéz, mint a
természetes nyelvek megértése számitógéppel. A másik irányzat a tervezési információkat a gép által érthető kódokban tárolja, a mérnök számára jól hozzáférhető, könnyen módosítható alakban. Ezt a fajta kapcsolatot könnyebben kivitelezhetőnek, fejleszthetőbbnek tartja, és rámutat a két különböző irányzat kombinálásának elő
nyeire. A CAD rendszerek fejlődését a magasabbrendu információ és tudásreprezentációtól, és hatékonyabb, speciálisabb probléma-megoldó rendszerektől várja.
Hasonló kívánságokat fejez ki M. Henrion [15], aki az automatikus terület-felosztási programok gyakorlati al
kalmazásának hiányáról ir, miután elemzi a létező leg- fontosann módszereket. Szerinte a kidolgozott rendszerek nem adekvátak a feladathoz, ezért nem találtak széles
körű alkalmazásra a tervező mérnökök között. Egy mód
szertanilag megfelelő rendszernek nemcsak a probléma m e g oldását, hanem a probléma definiálását és a kettő közötti kapcsolatot is tartalmaznia kellene jól érthető formá
ban. Javasolja a tudásreprezentáció IF< feltétel> THEN
<cselekvés> formáját, melyet 0. Akin is megfelelőnek talál a tervező mérnök gondolkodásmódjához. [1]. Ez utóbbi kívánságot a PROLOG teljes mértékig kielégiti.
Nem véletlen, hogy L.M. Pereira az általa kidolgozott automatikus területfelosztási probléma újszerű, grá
fokon alapuló elméletének megvalósításához a PROLOG prog
ramozási nyelvet javasolja [39].
A tételbizonyításon alapuló probléma-megoldás egy érdekes példáját láthatjuk G. Lafue " A Theorem Prover for Recog
nizing 2-D Representations of 3-D Objects" c. cikkében [25]. Az ORTHO program sokszög lapokkal határolt három
dimenzós testeket azonosit két dimenziós nézetek alapján.
Az input kétértelműségeit egy tétel-bizonyitó segítsé
gével szűrik ki a "generáld és ellenőrizd" elv alapján.
A program generálja a test lehetséges nézeteit, majd egy automatikus tételbizonyitó segotségével az inkon
zisztens nézeteket kizárja.
A fuzzy halmazok egy újszerű CAD alkalmazásával talál
kozhatunk J.S. Gero és M.Vofneuk "Building Fuzzy CAD Systems" c. cikkében [13]. Az épület tervezéséhez fi
gyelembe vett követelmény-rendszerbe úgy épitik be a szubjektivitást, hogy a feltételeket fuzzy tulajdon
ságoknak tekintve súlyozzák. így formalizálják a "pon
tatlanságot", az egyéni ízlést, s ezzel lehetőséget adnak arra, hogy egy és ugyanazt a CAD rendszert külön
böző típusú feladatokra a különböző felhasználók más és más szubjektív döntésnek megfelelően használják.
Láthatjuk tehát, hogy a logikai eszközök CAD alkalmazását az összetettebb, magasabb szintű tudásreprezentációt
és probléma-megoldó képességet igénylő feladatok váltot
ták ki. A PROLOG csak egy eszköz a sok között, bár jelen
leg a leghasználhatóbbnak tűnik.
Az első CAD PROLOG program Szőts Miklós nevéhez fűződik, aki egyszintes csrnokok méretezését oldotta meg 1975-ben
[43]. Az általa kidolgozott program előregyártott elemek
ből készülő, egyszintes, daruzatban ipari csarnokot tervez.
Kiinduló adatként a csarnok geometriai méreteit, és a födémet terhelő egyenletesen megosztó teher inten
zitását kell megadni. A program megtervezi az alap
rajzi rasztert (födémpanel kiosztást) , és kiválo
gatja a geometriai és statikai feltételeknek megfe
lelő elemeket.
Egy másik érdekes PROLOG alkalmazás Holnapy Dezső munkája, aki a szoliter-alaptervezés egy problé
máját fogalmazta meg PROLOG programmal.[17]. A fel
adat: épületpillérek alá megfelelő alaptestek bevá- logatása az eleve adott rendszer-komponens készlet
ből. Bemenő adatok az erőrendszer és az alapok kö
zötti távolságok listája; és az erők helyén alkal
mazandó alaptestek azonosítói képezik a végeredményt.
A jelen dolgozat szerzője által kidolgozott PROLOG alapú építészeti CAD feladatokkal a tanulmány részletesen foglalkozik [29, 3o, 31, 32] . Külön fejezetet szentelünk azoknak az elvi-módszertani
meggondolásoknak, amelyek a CAD programok egyszerű szerkezeti felépítését, könnyű módosíthatóságát cé
lozzák [18, 19]. A programlistákat, a komplexitás- számitás részletes adatait tartalmazó táblázatokat, a futási eredményeket, és az őket illusztráló ábrá
kat külön kötetben, a FÜGGELÉK-ben közöljük.
Itt szeretnék köszönetét mondani dr.Ágnes Kaposi-nak, aki a háromhónapos londoni kutatómunkámat lehetővé tett és irányította, s aki nagyban segítségemre volt
az újszerű komplexitáselmélet kialakításában. Köszö
nettel tartozom dr. David Warren-nek, aki lehetősé
get adott arra, hogy az Edinburgh-i Egyetem DEC-10 tipusu számítógépén a programjaimat tesztelhessem, s aki véleményével, tanácsaival segítette munkámat, dr. Dömölki Bálint-nak, aki lehetőséget nyújtott ar
ra, hogy a Számítástechnikai Koordinációs Intézet számítógépén dolgozhassak. Külön szeretnem megköszön
ni Köves Péter-nek az IBM 3031-es számitógép PROLOG interpretének installálását, s azt a segítséget, ame
lyet a kezdeti nehézségek áthidalására nyújtott. Kö
szönet illeti Rákossy István-t a többszintes lakóépü
letet tervező programrendszer építészeti koncepciójá
nak kidolgozásáért. Végül hálával tartozom Szőts Mik
lósnak, aki a tanulmány anyagához fűzött értékes meg
jegyzéseivel segítette munkámat.
2.A LOGIKAI PROGRAMOZÁS ÉS AZ ÉPÍTÉSZETI CAD 2.1. A PROLOG R Ö V I D I S M E R T E T É S E
Egy PROLOG program elsőrendű formulák egy rész
osztályának, a Horn-klózoknak véges sorozata. A Horn- klóz olyan implikáció, amelynek alakja megfelel az alábbi lehetőségek valamelyikének:
л pedig rendre az implikáció, a logika
"és" jele.
Atomi formula: egy P ( t ^ , . . . , ^ ) alakú formula,
ahol P egy к argumentumu relációjel, és t.-к 0< iá К termek.
í
Term: egy változó, vagy egy f (t^,...tK ) alakú ki
fejezés, ahol f egy к argumentumu függvényjel és t^-k Oá iá К termek. А О argumentumu függ
vényjel konstans.
A relációjelek, függvényjelek, és változójelek halmazai páronként diszjunktak.
A változókat minden klózban univerzálisan lekötöttnek tételezzük fel, a függvény és relációjelek, valamint
atomi formulák,
az Л, jelek jelentése a szokásos.Egy PROLOG prog
rammal valamilyen vizsgálandó univerzum leirását ad
hatjuk meg, majd a leirt világra vonatkozóan kérdé
seket tehetünk gél, illetve megoldandó célokat tűzhe
tünk ki. A kérdések megválaszolása illetve a célok megoldása jelenti a PROLOG program futását.
Az 1. és 2. tipusu klózokkal Írhatjuk le a feladat világát, melyeket rendre reduktoroknak illetve tény
állításoknak hívunk. A célok megadására a 3. tipusu klózokat használhatjuk, melyeket célállitásoknak ne
vezünk. A PROLOG interpretere tekinthető SL rezolu- ción alapuló automatikus tételbizonyitónak. M ű k ö désének pontos ismertetését mellőzzük, részletes leírása megtalálható [44]- b e n .Kiemeljük azonban
két fontos tulajdonságát, a mintaillesztést (pattern matching) és a visszlépést (backtracking). A minta- illesztés lehetővé teszi, hogy a feladatot először általános problémamegoldási sémákban fogalmazzuk meg, amelyek csak a program futása során fognak konkrét adatokkal aktivizálódni. A visszalépés pedig arra ad lehetőséget, hogy ha nem a megfelelő sémát aktivi
záltuk, sorra vegyük a még lehetséges sémákat, amig meg nem oldjuk a feladatunkat, vagy amig kiderül, hogy
a program által definiált univerzumban a feladatunkat nem tudjuk megoldani.
A program futása úgy kezdődik, hogy a feladat m e g fogalmazására szolgáló célállitás első atomjához az
interpreter keres egy olyan reduktort , vagy tényállí
tást, amellyel az mintaillesztéssel egyesíthető. A mintaillesztés egy célállitás - a jelenlegi szin
taktikus konvencióknak megfelelő elnevezéssel - egy negativ atomja és egy reduktor "feje"( a impli
káció konklúziója) vagy egy tényállítás, mindkét
esetben pozitiv atomja közötti illeszthetőséget ellen
őrzi, és ha lehetséges, a két kióz egyesítését végre
hajtja. Egy negativ és egy pozitiv atom illeszthető, ha
- relációjelük azonos, tehát argumentumaik száma is megegyezik;
- az egymásnak megfelelő argumentum párok rendre megfelelnek az alábbi három eset egyikének;
1. mindkét argumentum változó;
2. az egyik argumentum változó, a másik összetett term (azaz konstans, vagy függvények, változók és konstansokból generált kifejezés)
3. mindkét argumentum összette term, és illeszthe tők.
A hagyományos programozási nyelveknél megszokott "érték adás" művelete itt mintaillesztéssel történik, ha a fent emlitett 2. esetben az egyesítés után a változó értéke az összetett term lesz. Vegyük észre, hogy tel
jesen mindegy, hogy a negativ, vagy a pozitiv atom tartalmazza-e az összetett termet, az illesztéssel az értékadás mindkét irányban megtörténhet.
Egy célállitás és egy reduktor egyesítése úgy történik, hogy a reduktor negativ atomjai átveszik azokat az
uj értékeket, amelyeket a mintaillesztés során az argumentumok kaptak,( ha szerepeltek a negativ atomok
ban olyan v á l t o z ó k , amelyek a pozitiv atomban is szerepel t e k ). A továbbiakban ezek a negativ atomok önálló cél- állitásokká válnak, és újabb mintaillesztési eljárások
kal kielégithetôek. A feladat megoldása akkor fejező
dik be, ha az összes eleve kitűzött és generálódott célállitás a mintaillesztéssel kielégítést n y e r t . ( a tételt sikerült bebizonyítani). A program futásának másik megállási módja az, hogy a mintaillesztés siker
telensége miatt a feladatot - az adott feltételek mellett nem lehet megoldani( a tételt nem tudjuk bizonyítani).
Mivel az elősrendu logika nem eldönthető, nem tudjuk biztosítani, hogy a bizonyítási eljárás minden esetben végetérjen. Viszont a teljesség miatt igaz tétel esetén az eljárás sikeresen befejeződik.
2.2. A P R O L O G S A J Á T O S S Á G A I N A K F E L H A S Z N Á L Á S A A Z É P Í T É SZETI T E R V E Z É S M O D E L L E Z É S É B E N
Az építészeti tervezés nem determisztikus folyamat, a kivánt feltételek nem határozzák meg magát az épületet.
Az építészeti tervezésre a próbálkozások, variánsok előállítása a jellemző. A különböző változatok kiértéke
lése és a végső döntés újabb - esetleg szubjektív -
követelmények figyelembevételével történik. Egy automati
kus rendszer, amely a fenti folyamatot kívánja modellál
ni csak úgy működhet, hogy bizonyos alapvető szabályok
szeti CAD problémák, amelyek elvileg számitógépre ori
entáltak (pl. lakásalaprajz variációk előállítása) na
gyon nehezen programozhatónak bizonyultak a hagyományos eszközökkel. A PROLOG nyelv használata lehetővé tette, hogy bővüljön azoknak a feladatoknak a köre, amelyeket a számítógépre lehet b i z n i , s ezáltal az ember és a gép közötti munkamegosztás a magasabb fokú automatizálás irányába tolódjon el.
Ebben a fezetben egy konkrét CAD program bemutatásán keresztül sorba vesszük és elemezzük azokat a PROLOG- ban rejlő új lehetőségeket, módszereket, programozás - technikai megoldásokat, amelyek megkönnyítették, vagy lehetővé tették, eddig nem formalizált tervezési fo
lyamatok számitógépes automatizációját.
2.2.1. Paneles lakásalaprajz variációkat tervező program
A programrendszer adatbázisa, panelek, cellák
A program célja, hogy a budapesti házgyárak által gyár
tott panelekből adott méretű, szobaszámú és félszobaszámú lakások alaprajzi variánsait előállítsa. Jelen program a 2.sz. Házgyár paneléinek méreteivel működik, de az el
járás más házgyárak paneléire is alkalmazható, amennyi
ben az adatbázisban rögzített panelelemek méreteit meg
változtatjuk.
Mivel a lakás összes helyiségének sarokpontjai derék
szögű négyszöghálóra, un. modulhálóra illeszkednek, a programban a méreteket nem méterben, hanem modulban adjuk meg. A modul a teherhordó szerkezetek méreteinek
legnagyobb közös osztója. Ebben a rendszerben 1 modul = o,3 m.
A házgyár által gyártott födémelemek szériája adott (n db különböző méretű téglalap). A szükséges számú és méretű téglalapok egymás mellé illesztéséből adódó sikidom-változatokat nevezhetjük alaprajzi konturvari- ánsoknak.
A program 3 födémpanellal dolgozik:
F l - 2 , 7 m x 4 , 2 m F 2 - 2 , 7 m x 5 , 4 m F 3 - 2 , 7 m x 2 , 7 m
A födémpanelok határozzák meg a teherhordó egységek (cellák) méreteit. A program adatbázisába a cellákat vettük be. 4 teherhordó cella adott a következő for
mában :
CELLA (NAGY, 14, 18, 252 ) . CELLA (KIS, 9, 18, 162) . CELLA (FELNAGY, 9, 14, 126) . CELLA (FELKIS, 9, 9, 81) .
A zárójel utáni első paraméter a cella azonosítója, a második szélessége, a harmadik a hossza, a negyedik a területe modulban.
A NAGY cella a nappali szoba, a KIS cella egy kisebb méretű, pl. gyermek- vagy hálószoba, a FELNAGY és FELKIS cellák félszobák kialakítására alkalmasak. Egy NAGY cellából alakítható ki válaszfalak és a vizesblokk beállításával az un. OSZTOTT cella, amely a lakás összes egyéb helyiségét - az előszobát, konyhát, fürdőszobát, WC-t, gardrob-folyosót - tartalmazza.
A különböző OSZTOTT cellatipusok szintén a program adatbázisához tartoznak. Programrendszerünk kétféle OSZTOTT cellát kezel: egy étkezőkonyhás és egy
konyha-étkezőfülkés változatot. A konyha mindkét
esetben ablakos, tehát belső szellőztetésu konyhát nem engedünk meg. Az étkezőfülkés megoldás helykihaszná
lás szempontjából előnyösebb, ezért ahol lehet, ennek a változatnak van prioritása. A program adatbázisában egy OSZTOTT cellát, pl. a következő módon lehet repre
zentálni :
OSZTCEL (ETKFULKES, ABLAK, 13,NYÍLT, 8, 14).
A 6 argumentum értelme rendre a következő:
1 - A konyha típusa.
2,3,4,5 - Az északi, keleti, déli és nyugati fal jellemzése.
A példában a konkrét paraméterek jelen
tése a következő:
ABLAK: északon van a konyhaablak.
13: keleten 13 modulnyi zárt falrész van, a konyha és a vizesblokk keleti fala.
A többi lehet zárt és nyílt, azaz ajtóval ellátott falrész.
NYÍLT: A déli fal nyílt, lehet rajta ajtó 8: A nyugati falon 8 modulnyi falrész van a konyha nyugati fala.
6 - Az OSZTOTT cella szélessége a példánkban 14 modul.
A rendszer adatbázisában 5 különböző OSZTOTT cellavari
áns szerepel, ugyanis kétféle konyhatípus van, de az
ablak elhelyezésének változtatása és az OSZTOTT cella 90°-os elforgatása újabb variánsokat eredményez.
(1.á b r a ).
F Ü R D Ő
_ i —
W C
1. ábra
A program a lakásalaprajz-konturnak megfelelő OSZTOTT cellát úgy tervezi meg, hogy az adatbázisban rögzitett OSZTOTT cellák szimmetriaváltozataiból kiválasztja
azokat, amelyek a következő feltételerendszernek megfelelnek :
1. A konyha ablakos legyen.
2. Legalább 2 szoba külön bejáratú legyen (azaz az előszobából vagy a folyosóról nyíljon).
3. Biztosítva legyen a lakásba való bejárási lehető
ség.
A feladat megadása
A feladatot a következő formában jelöljük ki:
- LAKÁS (73,2,1) - FAIL.
Ez azt jelenti, hogy szeretnénk megtervezni egy maximum 73 m -es, 2 szobás + 1 félszobás házgyári 2
lakás összes lehetséges változatát. Ha csak egy változatra vagyunk kiváncsiak, azaz azt szeretnénk eldönteni, hogy lehet-e ilyen lakást tervezni, a - FAIL beépített predikátum alhagyható.
A szoba- és félszobaszám összege legfeljebb 5 lehet.
A programrendszer részei
Jelenleg a rendszer 2 szegmensből áll: az előkészítő programból és a főszegmensből.
Az előkszitő program
A program inputja a tervezendő lakás maximális alapte-
2 _
rülete m -ben, valamint a szobák es félszobák szama.
Az output:
a) A program által tervezett lakás alapterülete
m -ben (ez nem nagyobb az inputként megadott alap2 területnél ) .
b) A lakáshoz tartozó födémszükséglet, azaz hogy a különböző födémpanelokból külön-külön mennyire van szükség.
c) Egy cellalista vagy cellalista-sorozat. A cella
lista elemei az adatbázisban rögzitett teherhordó cellák azonosítói. Egy ilyen a tervezendő lakás
hoz szükséges cellákat tartalmazza. Például:
NAGY, KIS, F E L N A G Y .N I L .
A program egy feladatra több lehetséges változatot készit el. Futása után a tervezőmérnöknek kell eldön
tenie, hogy melyik változat a számára legmegfelelőbb.
A kiválasztott változat valamelyik cellalistája fog input adatként szolgálni a következő program, a fő
szegmens működéséhez.
A főszegmens
Inputja a cellalista.
Outputj a :
a) A teherhordó cellák geometriai elhelyezkedését m e g adó sarokpontok koordinátái modulban. Például:
NAGY 0; O. 0; 14. 0; 18. 18; 14.
b) A cellákhoz tartozó szobák ablakainak tájolása c) Az egyéb helyiségeket tartalmazó OSZTOTT cella
falainak koordinátái d) A konyha típusa
e) A konyhaablak tájolása
A В C
D E F
2. ábra
3. ábra
f) A konyha sarokpontjainak koordinátái g) A vizesblokk sarokpontjainak koordinátái h) A bejárati ajtó helye
i) A külön bejáratú szobák száma.
A föszegmens futása után megrajzolható a program által elkészített alaprajz. Ha rajzoló periféria is rendelke
zésünkre állna, közvetlenül rajzos output készülne.
(5, 6. ábra).
A fôszegmens - funkcióját tekintve - 3 lényeges részre tagolódik:
1. A teherhordó cellák geometriai egymás mellé illesztése, az OSZTOTT cella kijelölése, az ablakok helyének rögzítése.
2. Az OSZTOTT cella és a szobák falainak metszete, az un. KÖZÖS LISTA előállítása, amely az átjárásai és bejárási lehetőségek megadásához szükséges.
3. Az OSZTOTT cella felosztása konyhára, vizesblokk
ra, előszobára, gardrobe-folyosóra.
A különböző cellák (vagy téglalapok) egymáshoz illesz
tése alkotja a tervezési feladat gerincét. Ezért ezt a részt szeretnénk részletesebben kifejteni. Egy cella alaphelyzetének az adatbázisban rögzített helyzetét nevezzük. Emellett felhasználjuk a 9o°-kal elforga
tott helyzetet is. Egy lakás maximum 6 teherhordó cella összekapcsolásából állhat, a 2 ábrán bemutatott elren
dezésben .
A cellák összekapcsolására 3 illesztési szabályt vezet
tünk be (3. ábra) :
a) Két azonos szélességű cella kerülhet egymás alá, mégpedig úgy, hogy az 1. cella bal alsó sarka
illeszkedjék a 2. bal felső sarkához.
b) Két bármilyen méretű cella összekapcsolható úgy, hogy az 1. cella jobb felső sarka illeszkedjék a 2. bal felső sarkához, és a 2. alaphelyzetben van.
c) Két alaphelyzetben levő cella illeszkedhet úgy, hogy a 2. cella bal felső sarka 1,2 m-rel( azaz 4 modullal) lejjebbb van, mint az 1. jobb felső sarka.
4. ábra
Ha nincs külön letiltva, az elemeket alaphelyzetben és 9o°-kal elforgatva is illeszthetjük egymáshoz.
Az illesztés a következő algoritmus szerint megy végbe. A CELLALISTA első elemét kijelöljük kezdő
cellának. Ekkor a cellához két irányban: jobbra vagy alá lehet másik cellát kapcsolni. A jobbra kapcso
lás a c) vagy b) illesztési móddal, az alákapcsolás az a) illesztési móddal történhet. Ha a 2. elemet már összekapcsoltuk az 1-vel, akkor a 3. elemet kap
csolhatjuk az 1. vagy 2. elemhez a 3. illesztési mód valamelyikével, és igy tovább( lásd a 4. ábrát).
Az algoritmusból látható, hogy a CELLALISTA sorrendje befolyásolja a kialakuló sikidom formáját, De mivel a kötött sorrenddel is már elég nagy a variánsok száma
(a feladattól függően kb. 2o-5o db), ezért úgy
döntöttünk, hogy a főszegmensen belül nem változtatunk a CELLALISTA sorrendjén, ellenben az előkészítő szeg
mensben előállítjuk a CELLALISTA összes egymástól különböző perrautánsát. így a főszegmens többszöri futtatásával megkaphatjuk az összes lehetséges válto
zatot .
5. ábra. A főszegmens outputja
6. ábra
Lakásváltozatok
2.2.2. Programozási elvek, megoldások, fogások 1. A feladat felbontása
Egy eléggé komplex tervezési feladatot ritkán lehet egyetlen programmal megoldani, azaz teljesen automa
tizálni. Meg kell keresni azokat a pontokat, ahol emberi beavatkozás, döntés szükséges, és a feladatot ilyen módon kell szegmentálni. Az előző fejezetben említett feladat esetén két programra bomlott a rendszer, az előkészítő és a fő programra. Erre azért volt szükség, hogy elkerüljük a "kombinato
rikai robbanást". Célunk a feladat világába lévő összes lehetséges megoldás (alaprajzi variáns) előállítása.
Ha a feladatot egy programon belül akarnánk megoldani, a megoldások száma sokszorosa lenne a reálisan értékel
hető nagyságrendeknek, ráadásul sok azonos, fölösle
ges változat születne. Ezért egy ponton leszukiettük a döntési fát, kiválasztva egyetlen cellalista válto
zatot a következő program számára input adatként.
2. A feladat megadása
A feladatot kijelölő célállitás formája tükrözi a feladat tipusát. A
- LAKÁS (7o, 2, 1 ) .
célállitással azt a feladatot adjuk a programrendszer, nek, hogy tervezzen egy maximum 7o m -es, 2 szobás 2
1 félszobás lakást, avagy ellenőrizze, hogy egyáltalán kielégithető-e ez a kivánság. A
- LAKÁS (7 o , 2, 1) - FAIL.
célállitással a megoldás összes lehetséges változatát kívánjuk megkapni. Ez a trükk a PROLOG-nak azt a
tulajdonságát használja ki, hogy az interpreter a visszalépés segítségével "próbálkozni" tud. Az inter
preter a program futása során a leírt szabályok segít
ségével döntési fát épit fel. Amikor a program először végigfut, azaz a döntési pontok sorozatán keresztül
haladva elér a fa leveléig, előáll egy lakásalaprajz variáns. A program le is állna, ha a feladat megadása
kor nem szereplne a - FAIL predikátum, amely sohasem sikerül (azonosan hamis ) . A -FAIL predikátumot a következtetési mechanizmus úgy értelmezi, hogy zsák
utcába jutott, vissza kell lépnie, és meg kell próbál- /
nia egy másik változatot. így előállítja a következő alaprajzot, majd a FAIL-lel találkozva ismét vissza
lép stb. így a program bejárja az egész döntési fát, és minden lehetséges változatot előállit.
A előző fejezetben ismertetett feladatban ugyan nem használtuk ki, de másutt jól hasznosítható a PROLOG azon tulajdonsága, hogy egy reláció argumentumai input és out
put funkciót is betölthetnek, és igy egy azon reláció különböző feladatok megfogalmazására lehet alkalmas.
Tekintsünk pl. egy olyan programot, amely egy kórház épületcsoportjában lévő helységek funkcióit irja le.
Legyen a célállitásunk
- BENNEVAN (FŐÉPÜLET, IGAZGATÓSÁG).
Ez azt a kérdést fogalmazza meg, hogy vajon igaz-e, hogy az igazgatóság a főépületben van. A
- BENNEVAN (*X, IGAZGATÓSÁG) -OUTPUT (* X ).
azt kérdezi, hogy melyik épületben van az igazgatóság.
(a * -al kezdődő szimbólumok változókat jelölnek). A - BENNEVAN (P A V I L O N l ,* Y ). - OUTPUT (* Y ).
azt kérdezi, hogy milyen helység van az 1. Pavilonban. A - BENNEVAN ( P A V I L O N l , *Y ) - OUTPUT (*Y‘) - FAIL, célállitással az 1. Pavilon összes helységét megkap
hatjuk . Mig a
- BENNEVAN (*X, *Y ) .
célállitással azt tudhatjuk meg, hogy van-e egyáltalán olyan helységünk, amely az adatok között felsorolt épületek egyikében van.
3. Struktúrák reprezentációja
Épitészeti tervezési feladatok modellezése során szük
ség van olyan program-beli struktúrákra, amelyek több épitészeti egység (pl. szobák) kapcsolódási lehető
ségeit irja le. A struktúrák PROLOG programbeli egy
fajta lehetséges reprezentációi olyan "termek" azon lo
gikai kifejezések, ahol a függvényjelek az operátorok.
Bonyolult struktúrákat több operátor alkalmazásával épitünk fel, amelyek zárójelezési szabályait a priori
tási szám megadásával lehet definiálni.
Tekintsük a lakások általános sémáját megadó szerkezetet
A В C
D E F
А. В. С ! D. Е. F
6. ábra
A fenti struktúrában két operátort, a "!" és a
operátorokat használjuk. Kötési prioritásukat az ope
rátor deklarációban definiáljuk:
+ OPERATOR ( !, RL, 4) . + OPERATOR (., R L , 5).
ahol a RL azt jelenti, hogy a zárójelezés "right to left", jobbról-balra történik, lásd A . ( B . ( C. NIL))), és a
magasabb prioritású (5) operator köt erősebben, mint a "!" operátor (4). Tehát az A.B.C! D.E.F össze
tett struktúrában a "!" a "fenti" és "lenti" cellákat választja el, amelyek maguk is listák. A "fent" és "lent"
csak a struktúrában elfoglalt helyre és nem a lakás
vertikális szerkezetére utal. Mind a hat teherhordó cella egy szinten helyezkedik el.
Nézzühk egy példát a fenti struktúra program-beli alkal
mazására. Definiáljuk az ALATTA relációt, amely a fenti struktúra két egymás "alatti" elemét definiáija( pl: В és E ) :
+ALATTA (*X. *L1 ! *Y. * L 2 , *X, *Y ) . +ALATTA (*Z. *L1 ! *W. *L2, *X, *Y ) !
-ALATTA (*L1 ! *L2, *X, * Y ).
Az ALATTA reláció három argumentumából az első a lakás struktúráját, a második egy "fenti" cellát, a harmadik az "alatta" lévő cellát reprezentálja.
A két kióz értelme a következő:
1. *X cella alatt *Y cella van, ha a ! operátorral elválasztott listákból (*X. *L1 és *Y. * L 2 ) rendre ők az első elemek.
2. *X cella alatt *Y cella van, ha ugyan a *Z. *L1 és a *W. *L2 listákban nem ők az első elemek, de az első elemeket leválasztva az *L1 és *L2 maradék listákban *X alatt *Y van.
A megfogalmazásból látható, hogy az ALATTA relációt rekurzívan definiáltuk. Három elemű listák esetén ez a definíció fölöslegesen általánosnak tűnhet, de fel
téve, hogy az alapvető szerkezeteket esetleg bővít
hetjük, ez a tömör és általános megfogalmazás a vál
toztatás után is érvényes maradna.
4. Elforgatás, szimmetriái viszonyok
Az építészeti tervezés modellezésében alapvető fontos
ságú a különböző síkidomok (többnyire téglalapok) geo-
metriai transzformációknak ábrázolása. Ez a feladat PROLOG-ban igen frappánsan megoldható a megfelelő relációk argumentumaival való manipulálással. Né
hány példa:
4.1. Az adatbázisban szereplő "teherhordó cellák", téglalapok egy rögzített geometriai elrende
zést tükröznek: a
+CELLA (NAGY, 14, 18, 252).
tényállás azt jelenti, hogy a NAGY azonosí
tóval ellátott teherhordó cella "széle" 14 modul, "hossza" 18 modul, területe 252 modul.
NAGY 18
■V
7. ábra
Ezt a téglalapot a tervezés során az adatbázisban rögzített helyzetében és 9o°-al elforgatva is sze
retnénk használni. Ezt a szabályt a követekező 2 kióz segítségével tudjuk megfogalmazni:
+CELLA1 ( »AZONOSI T O , »SZELE, »HOSSZA, »TERÜLETE) -CELLA (»AZONOSITO, »SZELE, »HOSSZA, »TERÜLET®) +CELLA1 ( »AZONOSITO, »SZELE, »HOSSZA, »TERÜLETE)
-CELLA (»AZONOSITO, »HOSSZA, »SZELE, »TERÜLETE)
NAGY H0SSZA=18
.i —
NAGY HOSS ZA=14
SZELE=14
- - - +
8. ábra
I S ZELE=18
I
4.2. Ha a programban tögzitett téglalap egyik ol
dalát ÉSZAK-i-nak definiáljuk, a többi irányt a szokásos módon jelölhetjük ki. így beszélhe
tünk északra, vagy délre nyiló ablakokról, a lakás bejáratának irányáról.
ÉSZAK NYUGAT
DÉL
KELET
9. ábra
Defináljuk az egymással szemben lévő irányokat, és azokat az iránypárokat, amelyek egy szoba sarkaiban futnak össze.
+IRANY (ÉSZAK).
+IRANY (KELET).
+IRÁNY (DEL).
+IRÁNY (NYUGAT).
+SZEMBEN (ÉSZAK, DEL).
+SZEMBEN (KELET, NYUGAT).
+SZEMBEN ( *X, *Y) -SZEMBEN (*Y, *X).
+SAROK (*X, *Y)
- N O T ( SZEMBEN (*X, *Y)).
Látható, hogy a SZEMBEN reláció szimmetrikus vol
tát külön definiáltuk. A "NOT" beépített eljárás jelentése a következő: a NOT (R (t^,...,t ))
eljárás akkor sikerül, ha R(t^,...,tn ) eljárás nem sikerül, és forditva, ha a R ) eljárás sikerül, a NOT R t )) nem sikerül.
4.3. Ha a téglalap sarokpontjait egy koordináta-
rendszerben elhelyezett koordináta értékpárokkal adjuk meg, akkor a transzformációkat a következő
képpen definiálhatjuk. Tekintsünk egy Q téglalapot
; F Q4 Q3
Q
A ; В C;D Ql Q2
l o . ábra
A +TEGLA (A ; B , C;D, E ; F , G;H ).
tényállás négy paramétere rendre a négy sarokpont koordináta párja. Az abszcissza és ordináta érté
kek a operátorral vannak elválasztva.
A sarokpontokból listát is készíthetünk; s igy egy téglalap helyzetét ez a lista pontosan definiálja:
Ql. Q2. Q3. Q4. NIL
Nézzük meg, hogy hogyan kapjuk meg egy Q téglalap Q1-Q2 egyenesre vonatkozó R tükörképét:
A4 ;B4=Q4
Ql
X4;Y4=R4
Q3=A3;B3
Q
R
Q2
R3=X3;Y3 11.ábra
+TUKR0Z ( *Ql. *Q2. *Q3. *Q4. NIL, *R4.*R3.*Q2. *Q1.NIL ) - T Á VOLSÁG( Q1,*Q4,*T)
-TŰK (*03,*T,*R3) -TŰK (*Q4 , *T', *R4 ) . +TAV0LSAG (*XI;*Y1, *X4 ;*
-MINUS (*Y4, *Y 1 ,*T).
+TUK (*A;*B, * T , *A; *Y ) -TIMES (*T, 2, *Z) -MINUS (*B, * Z , *Y) .
Bármely egyéb transzformációt a fent definiált struktúrák segítségével hasonló módon kaphatunk m e g .
5. Adatbázis - kezelő eljárások használata
A legtöbb PROLOG interpreter változat rendelkezik olyan beépitett eljárásokkal, amelyek módosítják az adatbázist, illetve magát a programot, hiszen PROLOG program esetén
az adat és a program egységes szerkezetűi mindkettő Horn-klózokkal reprezentált). Ilyen eljárás az
ADDCLAUSE, amelynek hatására uj klózzal bővül a program, a DELCLAUSE, amely kitöröl egy klózt, és a SUPCLAUSE, amely időlegesen kitöröl egy klózt, de visszalépés esetén a kióz újra érvényes lesz.
Az ADDCLAUSE jól használható arra a célra, hogy a
futás egy részeredményét ne egy uj argumentumban, hanem egy újonnan felvett klózban tároljuk. Nézzünk egy
példát az ADDCLAUSE használatára:
A paneles lakásalaprajz tervező program előkészítő al- programjának outputja a teherhordó cellák azonosítóiból álló cellalista. Ez a lista fog input adataként szol
gálni a következő programhoz. De mivel a cellalista ele
meinek sorrendje befolyásolja a lehetséges alaprajzi variánsokat, az összes lehetséges megoldást csak úgy kaphatjuk meg, ha generáljuk a cellalista összes permu
tációját. Ezt a funkciót a PERM nevű eljárás végzi, amelynek két argumentuma van. Az első a permutálandó lista, a második az elsőnek egy permutációja:
- PERM (*CELl, *C E L 2 ).
A PERM eljárás pontos definícióját és magyarázatát később közöljük, most rátérünk arra, hogy hol és miért használtunk az ADDCLAUSE adatbázis kezelő eljárást. A cellalista elemei között több azonos is lehet, s igy a PERM eljárás sok felesleges, egymástól nem különböző permutációt generálhat. Számunkra azonban csak a külön-
böző permutációk érdekesek. A RÉSZ nevű eljárás segít
ségével generáljuk a *CEL1 lista egy permutációját, ellenőrizzük, hogy az uj permutáció azonos-e valamelyik régebben generálttal, és csak akkor nyomtatjuk ki, ha különböző.
+RESZ (*CEL1, *CEL2)
-ADDCLAUSE (+ (CLAUSE (*CEL1)). NIL) -OUTSPACES (13) - OUTPUT (* C E L 1 ) -PERM (*CEL1, *CEL2 )
-KULONBOZ (*CEL2).
+KULONBOZ (* C E L 2 )
-CLAUSE (*CEL2) -/.
+KULONBOZ (*CEL2)
-ADDCLAUSE (+ (CLAUSE (*CEL2)). NIL)
-NEWLINE -OUTSPACES (13) - OUTPUT (* C E L 2 ).
A RÉSZ eljárás a következőképpen működik:
ADDCLAUSE segítségével felveszünk a programba egy uj klózt, amelynek neve CLAUSE, és egyetlen argumentuma van, a *CELl-ben lévő permutálandó lista. Ezt a listát az OUTSPACES és OUTPUT beépített eljárások segítségével ki is nyomtatjuk. Majd meghívunk a PERM eljárást, amely a
*CELl lista egy CEL2 permutációját fogja generálni.
A következő KULONBOZ eljárásnak két esete van. Az első, hogy az újonnan generált permutáció megegyezik egy elő
ző, az adatbázisban a CLAUSE nevű klózokban tárolt lis
ták egyikével. Ekkor a -CLAUSE (*CEL2) célállitás illeszkedik valamilyen +CLAUSE(*X). alakú klózhoz, és
a KULONBOZ első változata sikerül. Ebben az esetben nem nyomtatjuk ki a listát, hiszen ez ismétlés volna.
A másik esetre akkor kerül sor, ha az első nem teljesül Ekkor az újonnan generált permutáció eltér az összes előzőtől, ezért felvesszük ADDCLAUSE segítségével egy uj +CLAUSE(* C E L 2 ). alakú tényállításba, és ki is nyom tatjuk. Mivel az egész program -LAKAS (7o, 1, 2) -FAIL, célállitásokkal van meghiva, azaz az összes lehetsé
ges megoldást keressük, ezért a visszalépések követ
keztében a PERM eljárás az összes lehetséges permutá
ciót generálni fogja, de kinyomtatni csak az egymástól különbözőket fogjuk (1 2. ábra).
Egy lista összes lehetséges permutációinak generálása olyan általános feladat, amely más programban is használható, s amelynek rekurziv definíciója PROLOG- ban igen tömör és szemléletes:
+PERM (NIL, NIL).
+PERM(*A, *E. *Y) -ELEME (*A,*E)
-KIHAGY( * A , * E , *B) -PERM (*B, *Y).
+ELEME ( NIL, NIL).
+ELEME ( *X. * L , *X).
+ELEME ( *X. *L, * Y ) -ELEME (*L, * Y ).
+KIHAGY (*X. *L, *X, * L ).
+KIHAGY (* Y . * L , *X, *Y . *L1) -KIHAGY (* L , *X, * L 1 ).
A fenti programrészletet a következő módon értelmez
hetjük:
PERM:
Az üres lista (NIL) permutációja az üres lista.
Egy * A lista permitációja egy olan *E. *Y lista lesz, ahol
- *E a lista első eleme és *Y a maradék lista;
- *E az *A lista egy eleme;
- az *A listából az *E elemét kihagyva *B listát kapunk;
- *B lista egy permutációja *Y lista.
ELEME :
Az üres lista eleme az üres lista.
Egy *X.*L alakú lista eleme az *X. ( az első e l e m e )- Egy *X.*L alakú lista eleme az * Y , ha eleme az *L maradéklistának.
KIHAGY :
Egy *X.*L alakú listából ha kihagyjuk az *X elemét, akkor *L listát kapunk.
Egy * Y . *L alakú listából ha kihagyjuk az *X elemét egy * Y . *L1 alakú listát kapunk, mégpedig úgy, hogy az *L listából kihagyva az *X elemet *L1 listát ka
punk.
6 о Hierarchikus, strukturált programozás
A PROLOG nyelv felépítéséből adódik, hogy szinte csak strukturált programokat Írhatunk, és a programszerve
zés hierarchikus. PROLOG-ban ugyanis úgy kell progra
mozni, hogy a feladatot részfeladatokra bontjuk reduk- torok segítségével, majd ezeket tovább bontjuk stb.
A részfeladatokra bontás egészen addig történik, amíg a részfeladatok olyan egyszerűnek nem lesznek, hogy megoldhatók tényállásokkal, vagy az interpreterbe beépí
tett eljárásokkal. Nagyon megkönnyíti a programozási technikát, hogy bizonyos részfeladatok a program egé
szétől függetlenül megfogalmazhatók.
7. Prioritás
A PROLOG következtetési mechanizmusának egyik alap
vető tulajdonsága, hogy ha egy szabályból több változat
van, akkor mindig a lehetséges elsőt választja.
Ezáltal lehetőséget ad bizonyos prioritások érvénye
sítésére. A prioritásokon egyszerű sorrendcserével lehet változtatni. így amikor a program előállítja az összes alaprajzi variánst, először a számunkra ked
vezőbb, később a kevésbé kedvező, de lehetséges vál
tozatokat állitja elő.
8. Módosithatóság
A PROLOG nyelven irt programot rendkívül egyszerű mó
dosítani. Egy PROLOG program Horn-klózok listája, ahol a kiózok ponttal vannak elválasztva. Ha valamely szabály
ból több változatot akarunk készíteni, egyszerűen felso
roljuk a szabályokat egymás után. Ha bőviteni akarjuk e szabályok körét, akkor anélkül, hogy a már megirt uta
sításokon bármit is változtatnánk, a meglévő szabályok mögé beirjuk az uj szabályokat. Éppen ilyen egyszerű
bizonyos szabályok elhagyása, Ennek igen nagy a jelentő
sége, hiszen például kellően nagy feladat esetén a va
riációk száma olyan naggyá válhat, hogy bizonyos megszo
rítások, és letiltások nélkül a program nem lenne gaz
daságos .
3. LOGIKAI ALAPÚ PROGRAMOK KOMPLEXITÁSA 3.1. A K O M P L E X I T Á S SZÁMÍTÁS C É L J A
Jelenleg több időt és energiát igényel a meglévő software eszközök karbantartása illetve módosítása, mint az új programok fejlesztése. Több tudományos központban megindult a kutatás olyan, számmal m é r hető mértékek definiálására, amelyek valamilyen módon a programok egyszerűségét, érthetőségét
és főleg megbízható módosíthatóságát mérnék. Ilyen mértékek birtokában objetiv módon lehetne értékel
hetni a különböző programvariánasokat, és a változó szempontoknak megfelelően optimális mutatókat le
hetne javasolni.
Bill Curtis és társai cikkükben
Í6l
a programok kétfajta komplexitását különböztetik meg:
- számítási (computational) és - pszichológiai komplexitást.
A számítási komplexitás a feladat megoldásának ki
számításával kapcsolatos kvantitatív aspektusokat veszi figyelembe, mint például a megoldó algoritmusok gyorsasága, vagy a lehetséges programágak száma.
A pszichológiai komplexitás a software eszközök azon tulajdonságaira utal, amelyek a program érthetőségét, egyszerű és gyors módosíthatóságát befolyásolják.
Az utóbbi években kifejlesztett komplexitáselméle
tek közül jelentősnek mondható M.H. Halstead
munkássága [14]. Halstead a programok generálására fordított munka nagyságát négy egyszerű paraméter
ből vezeti le:
n - a programban előforduló különböző operátorok száma;
n2 - a programban előforduló különböző operandusok száma;
N^ - az összes operátor teljes előfordulásainak összege;
N2 - az összes operandus teljes előfordulásainak összege,
ahol operátor minden alapszó (pl. GOTO, IF THEN ELSE, BEGIN...END, stb) , cimke, zárójelek, mate
matikai műveleti jelek (pl. +, -, *, :), értékadás jele, az utasításokat elválasztó jel (pl. ;),
és egyéb az előzőektől szintaktikusán megkülönböz
tethető jelek;
operandus minden változó és konstans.
A program hossza N=N1+N2;
A program szótárának nagysága п = п^ + П2'"
A program"köbtartalma" (volume) V= N log2^;
A program minimális vagy potenciális köbtartalma
* , * V =n l°9 2n
ahol V a program olyan változatának köbtartal
ma, amelyben az operátorok és az operandusok nem ismétlődnek, tehát
N 1 - nl '
it *_ * N 2 n2
A program szintje L = V ; 2n.
L ~
V N 2
A programozási munka mértéke T2 E = V _
L V*
és n*=n1* +n2* •
közelítőleg
(programming effort)
közelítőleg
n-j_ N2 (N1+N2) log 2 ( ^ 2n2
Ez utóbbi formulával lehet kiszámítani közvetlenül a programlistából a program "pszichológiai" komple
xitását .
Az irodalomban publikált komplexitás mértékek közül a McCabe ötletének volt a legnagyobb sikere [33].
McCabe a programok blokkdiagramjait irányított grá
foknak tekinti, s a gráfok ciklomatikus számának kiszá mitásával az alapvető programágak számát határozza meg V(G)= élek száma - csúcsok száma +2
ahol - G egy P program blokkdiagrammja által meghatározott irányított grág,
-V(G) a P program McCabe szerinti komplexitás m é r t é k e .
McCabe javasolja, hogy egy önálló program egység, egy modul V(G) értéke ne haladja meg a lo-et. Szerinte
ily módon biztosítani lehet az egyszerű és áttekint
hető programszerkezetet.
McCabe ötletének finomításával G.J. Myers Гз б]}, és módosításával G. Oulsnam Г38Д foglalkozik. Halstead és McCeb módszereinek kísérleti alkalmazását és rész
letes értékelését B. Curtis és kutatócsoportja végezete el E 63. Szerintük a McCabe féle komplexitási mérték inkább a programok számítási, mintsem a pszichológiai komplexitását méri; habár figyelemreméltó összefüggés tapasztalható a kísérleti eredményekkel alátámasztott intuitív pszichológiai és a számítási komplexitás kö
zött. Vannak azonban a pszichológiai komplexitásnak olyan aspektusai, amelyeket sem McCabe, sem a Halstead féle mérték nem vett figyelembe. Ezért javasolják olyan űj komplexitás-mértékek definiálását, amelyek jobban tükrözik a programozó információ-feldolgozási és prob
léma-megoldó képességét.
Éppen ez volt a célunk, amikor a PROLOG programok szer
kezeti bonyolultságát vizsgálva bevezettünk űj komp
lexitás mértékeket. Mivel a PROLOG "nagyon magas szintű nyelv, a probléma-megoldás általános szerkezete sokkal jobban tükröződik magukban a programokban, mint a hagyó
mányos algoritmikus nyelvek esetén. így a logikai programozás eleve strukturált, hierarchikus szer
vezettsége megkönnyítette számunkra, hogy olyan programegységeket találjunk, amelyek mérete, és mennyisége befolyásolja a programok érthetőségét, módosíthatóságát, azaz a "pszichológiai komplexi
tást" .
3,2. PRIMLOG - A PROLOG EGY M E G S Z O R Í T Á S A
A strukturált programozás elveinek megfelelően be lehet vezetni a PROLOG-ban olyan szintaktikus
megszorításokat, amelyek csak a legegyszerűbb program- szerkezetk használatát engedik meg( PRIMLOG = PRIMitiv p r o L O G ). Ezen egyszerű programszerkezetek definiá
lásával és egy erre épülő programtervezési módszer bevezetésével az volt a célunk, hogy a programok jól áttekinthetőek, könnyen módosithatóak legyenek, s ezzel párhuzamosan a szemantikus hibák csökkenését, a teszte
lési idő lerövidítését vártuk [18].
Az alapvető programszekezeteket partícióknak neveztük.
A TASK partíciót kivéve - amely a feladat megadását definiáló célállitás - egy partició olyan kiózok so
rozata, amelyek pozitiv atomjai ugyanazt a relációt tartalmazzák. A szintaktikus megszorítás kulcsszáma a a kettő (2)
- a p a r t i d o n belüli kiózok száma,
- egy partíción belüli negativ atomok száma, - egy atomon belül az argumentumok száma,
- és egy argumentumon belül az operátorok száma
maximálisan kettő lehet. (Kivételt képez a DATA BASE p a r t i d é , amely olyan egyszerű, hogy a benne lévő kiózok számára nem tettünk kikötést).
Egy PRIMLOG program particiók sorozata. 5 különböző tipusú p a r t i d é t definiáltunk: TASK, AND, OR, RECURSION és DATA BASE. Minden program egy TASK partícióval kez
dődik, és ezen kivül még legalább egy DATA BASE p a r t i d ét kell hogy tartalmazzon.
A particiók definiciója* :
TASK: -R( 6-L, 62 ) - Р(РХ /Р2 )•
AND: +R
(T1'T2 } - A(
61'62 ) - B(
p l'p 2 ) ’ OR: +R
(t1't2 } - A(
çl ' Ç2 * * +R (6r 62 ) - B(
P 1'P 2 )‘
RECURSION: +R (t^, t2 ).
+R
U lf
62 ) - A ( ç x ,?2 ) R( P]^, P2 ) ■ vagy* Egy A <-Bl AB2 f o r m á j ú i m p l i k á c i ó t a PROLOG m a g y a r v e r z i ó j á n a k m e g f e l e l ő s z i n t a k t i k u s k o n v e n c i ó s z e r i n t +A —B 1 - B 2 f o r m á v a l f e j e z ü n k k i .
+ R ( 6 r ,62 ) - A ( ç lf Ç 2 }
" R (Рд_» P 2 }
+ R ( T 1 (,T2 ) •
D A T A BASE: + R
( T 1*’ T 2 ) ' + R (P]_.,p 2 ) -
+R (6^,6 2)*
ahol R, P, А, В különböző bináris relációjelek;
T1'T2'Ç1'Ç2'6 1'6 2'P1 ' P 2 termek, amelyekben legfeljebb két különböző függvényjel szerepel
het.
Egy PRIMLOG program Írásának algoritmusát a következő blokk diagramban reprezentáljuk (13. ábra)
JELÖLES s - az akció tovább bomlik 1 - terminális akció
13. abra
A PRIMLOG programfejlesztési módszert úgy hasonlí
tottuk össze az Ad-hoc PROLOG programozással, hogy elkészítettük a 2.2.1. fejezetben tárgyalt paneles lakásalaprajz variációkat tervező program előké
szítő alprogramjának PRIMLOG változatát. A két prog
ramot ugyanazon a számitógépen futtattuk, a Poly
technic of the South Bank, London DEC-lo tipusu számitógépen. Azonos input adatra a két program vál
tozat ugyanazt az outputot adta, habár a programok szerkezetei erősen elütöttek egymástól, lásd. 14, 15. ábra. Megvizsgáltuk a programok hosszát, a fu
tási időt és m e m ó r i a igényt is, s a következő konk
lúzióra jutottunk:
1. A PRIMLOG program szerkezete egyenletesen átte
kinthető, világosan látszik rajta a bináris de- kompozició szisztematikus használata, ugyanakkor a PROLOG program szerkezete kiegyensúlyozatlan, néhol egyszerű, néhol nagyon bonyolult dekom- poziciós struktúrát tartalmaz.
2. A PRIMLOG változat tesztelési ideje rendkívül rövid volt, mindössze 3 szemantikus hibát kellett korrigálni. A PROLOG program szemantikus hibáira nem tudunk pontos adatot mondani, mivel annak be- lövése három évvel előbbre nyúlik vissza, de számuk jóval több volt, kb. lo-12. S habár nem szabad fi
gyelmen kivül hagyni, hogy a PROLOG változat szü
letett először és a PRIMLOG változat másodszor, és egy második program mindig jobb mint az első, a szemantikus hibák csökkenésére bizonyára erős ha
tással volt az egyszerű és áttekinthető program
szerkezet is.
14 . ábx'a
JEL: C D " UJ PARTÍCIÓ Ц ” MÁR DEFINIÁLT PARTICIO/KLOZ E h BEÉPÍTETT p r e d i k á t u m
15.ábra
3. A PRIMLOG program hossza több mint a két
szerese a PROLOG programnak, az előbbi 53, az utóbbi 24 particiót tartalmaz. Ennek megfele
lően a memória-igény is megnövekedett 1699 szóról 28o3 szóra.
4. A PRIMLOG program hierarchikus szintjeinek szá
ma lo, több mint kétszerese a PROLOG program megfelelő adatának, amely 4. Ezt egy kissé sok
nak találtuk, hiszen a globális áttekinthetősé
get rossz irányban befolyásolja a hierarchikus szintek ilyen mértékű növekedése.
5. A vizsgált feladat futási idejében nincs lé
nyeges különbség, PROLOG: 15,13 sec. PRIMLOG:
17,45 sec.
6. A PRIMLOG program önálló dekompoziciós egységeit, a partíciókat túlságosan egyszerűnek találtuk.
Egy partició néhol igen kevés gondolatot realizált, s ügy éreztük, hogy a programozó munkáját sok
esetben nem könnyítették, hanem nehezítették a rákényszerült szigorú dekompoziciós szabályok.
Az 1. és 2. pontban felsorolt előnyöket és a 3.f 4. és 6. pontban összefoglalt nyilvánvaló hátrányokat egybe
vetve arra a meggondolásra jutottunk, hogy a PRIMLOG alapötlete jó, de előnyösebb megvalósításához a defi
níció némi korrekciójára lenne szükség. Több gondolatot