Gal Tamas Zoltan <gtz(a)ludens.elte.hu> writes:
Köv. fennakadás a borotválás kapcsán ért. (Annak
ellenére, hogy már
sokszor említésre került órán. ) A 147. slide-ról próbálom
kisilabizálni, hogy mirõl van szó, de egyelõre semmi támpontom sincs.
Ezért egyszerûen csak azt kérdezem:
- Hogyan lehet (és mi értelme) címkézés közben szûrni azon túl, hogy
észrevesszük a meghiúsulást, és visszalépünk? Mert ezt egy labeling is
megteszi nekünk.
- Melyik eljárásban lehet alkalmazni a filter opciót? (labeling?)
Magyarul: hogyan mûködik szintaktikailag egy borotválás?
(A kérdésem végül is az: Mi az a borotválás? :) )
A borotvalas lenyege:
Cimkezesi lepesek elott ill. kozott vegig kell nezni a cimkezendo valtozok
listajat, es az egyes valtozokra a kovetkezoket tenni:
- megprobalni valamilyen ertekre behelyettesiteni,
- ha ez meghiusulast okoz, akkor az adott ertek kihagyhato a valtozo
tartomanyabol,
- ha ez nem okoz meghiusulast, akkor a behelyettesitest meg kell
szuntetni, es (sajnos) nem lehet szukiteni
Mindez egy kb. ilyen Prolog koddarabbal megvalosithato:
( \+ (X = c) -> X #\= c
; true
)
Amivel itt varialni lehet, az az, hogy milyen (c) ertek(ek)kel
borotvaljunk es milyen surun borotvaljunk (csak egyszer, a cimkezes elott,
vagy minden cimkezesi lepes elott, vagy csak minden masodik cimkezesi
lepesben, stb.) Azt is lehet, hogy az egyenloseg helyett egy masik relaciot
hasznalunk, pl.:
( \+ (X #< c) -> X #>= c
; true
)
vagy, pl.:
( \+ (X in {c,d,e...}) -> X in \{c,d,e}
; true
)
Mit ertesz egesz pontosan cimkezesi lepes alatt?
A cimkezes bemenete egy valtozo-lista. A cimkezes soran ebbol a listabol ki
kell valasztani egy valtozot, amelyet behelyettesitunk vagy szukitunk --
amitol persze sok mas valtozo is behelyettesitodhet vagy szukulhet. Ezutan
a valtozo-listabol elhagyjuk a mar behelyettesitett valtozokat, es az igy
kapott uj listara rekurzivan folytatjuk a cimkezest.
Ennek a ciklusnak a magjat hivom en egy cimkezesi lepesnek.
A cimkezes elott, utan, vagy ket cimkezesi lepes kozott kerulhet sor a
borotvalasra, aminek az eredmenye -- a cimkezesi lepeshez hasonloan -- az,
hogy a valtozo-listaban szereplo valtozok behelyettesitodhetnek, vagy
szukulhetnek. A ket alapveto kulonbseg a cimkezesi lepes es a borotvalas
kozott, hogy:
- a cimkezesi lepesben mindig tortenik szukites (vagy specialisan
behelyettesites), a borotvalasnal ez nem garantalt,
- a cimkezesi lepes valasztasi pont letrehozasaval jar, a borotvalas vegso
soron nem (kozben letrejon ugyan egy valasztasi pont, de azt mindenkeppen
megszuntetjuk, lasd a fenti peldakban a felteteles szerkezeteket)
Tehat legegyszerubb borotvalasos cimkezesnek valami ilyesmit javasolok:
cimkezes(L0) :-
borotvalas(L0, L1),
( L1 == [] -> true
; L1 = [X|L2],
indomain(X),
cimkezes(L2)
).
Ebben igy most nincs elmes valtozokivalasztas (pl. ff, vagy ffc), de ennek
ellenere ez lehet a nyero. A valtozokivalasztas megtartasahoz a labelingen
belul a value opcioba lehet beagyazni a borotvalast.
Ha meg mindig nem vilagos, irj!
-Peter