Jump to content
GSForum - Segélyvonal

Logikai és funkcionális programozás


Drizzthsz

Recommended Posts

Drizzthsz

Sziasztok. Valaki szokott ebben a programozási paradigmában csinálni valamit? Nekem idén volt deklaratív programozás tárgyam Bme-info-n, elõször meghúztak szóbelin, aztán négyes lettem(életem eddigi legjobb Bme-s jegye. :D), de a tárgyat már az elejétõl fogva igencsak érdekesnek találtam. Gyakorlatban csak az iskola gyakorló\kikérdezõ rendszerét használtam, interpretert életemben el nem indítottam, de úgy gondolom, hogy azért jól megértettem a dolgokat.

 

Az érdekelne leginkább, hogy az ilyen jellegû programnyelvekkel milyen irányban lehetne továbbhaladni a jövõben, úgy hogy ma is tudjam használni, amiket tanultam?

 

Amúgy a nagyfeladatok, amik voltak a vizsgámon:

Prolog:

1. Kell egy segédfüggvény, ami egy helyettesítési lista alapján megadja egy változó helyettesítési értékét, pl.:

helyettesítve([X-3,Y-4],X,E)?

E=3

2. Egy eljárás kap egy helyettesítési listát, egy matematikai kifejezést, s kiadja az eredményt, ha a változókat behelyettesítjük az értékükkel a kifejezésben. Pl.:

behelyettesitve(X+Y.[X-3,Y-4],E)?

E=7

 

(A szintaxisra már nem emlékszem tisztán. :upsz: Lehet elrontottam)

 

SML:

Segédfüggvény, ami bináris számot, amit sztringként adunk, egész int-té alakít, fõfüggvény: Egy bináris fa ágaiban lévõ bináris értékek összegét decimálisan megadja int-ként.

Link to comment
Share on other sites

arpsoft

Sajnos a prolog teljesen kiesik a tudástáramból.

Link to comment
Share on other sites

Drizzthsz

Szia, igen érdekes ez a programozási nyelve, benne nem azt kell megmondanod, hogy mit és hogyan kell megcsinálnia a gépnek, hanem szinte csak azt, hogy mit szeretnél megcsinálni. A nyelv típustalan. Alapjai a matematikai állítások, "klózok".

Pl.: ha akarsz egy olyan programot, ami megmondja egy adathalmazról, amiben az van elírva, hogy kinek ki a szülője, hogy ki kinek a nagyszülője, akkor a következő a dolgod:

Fogod, s megmondod, hogy logikailag hogy van eez a dolog:

"Egy ember nagyszülője egy másiknak, ha van olyan ember, aki a nagyszülőnek gyereke, de a másik illetőnek az apja, prologban kábé így néz ki egy ilyen állítás:

nagyszuloje(nsz,un):-

szuloje(nsz,sz), szuloje(sz,un).

A függvényekben leggyakrabban rekurziót alkalmazunk, főleg jobbrekurziót, mert az gyorsabb, ha jól emlékszem.

 

Érdekes programnyelv, s sokat formál a szemléletmódodon, de nehéz belevágni oop, meg egyszerűbb struktúrált programnyelvek után.

Link to comment
Share on other sites

arpsoft

Nem biztos, hogy nehéz, csak egészen más gondolkodásmódot követel.

Úgymond nem életszerû, legalábbis nekem elég absztraktnak tûnik. Egyébként hol használják ezeket? Szimulációknál? Hálózatelméleti kérdéseknél?

Link to comment
Share on other sites

Drizzthsz

Sokrétűen lehet alkalmazni, gyakran használják a prologot pl.:nyelvtani elemzőként. Főképp meg a rekurzív függvények számítására hatékony nyelv. Meg az elején azt mondták, hogy elosztott rendszerek programozásánál lehet majd hasznosítani, de nem kristályosodott ki, hogy hogyan is.

 

Ne idézz feleslegesen! - arpsoft

Link to comment
Share on other sites

arpsoft

Vannak benne elágazó függvények vagy csak lineárisan lehet programozni vele?

Mert egy kicsit utánajártam, de sehol nem találtam még feltételes utasításokat.

Link to comment
Share on other sites

Drizzthsz

De amúgy voltak olyan problémák, amiket mondjuk Prologban max. 10 sorban lekódolsz, de más programnyelven igen bonyolult lenne, pl.: Kapunk egy szót, s van egy függvény, ami eldönti, hogy a szóban van-e olyan részszó, ami úgy néz ki, hogy egy szó, s utána a tükrözöttje van benne, pl.: cabbad, erre kiadja a függvény, hogy: abba. De minden bonyolultságú szóra megcsinálja ezt, ez prologban bár nehezen érthetõ megoldású, de nem sok sorban le lehet írni.

 

Illetve a függvények(bár inkább eljárás, vagy klóz a helyes kifejezés) paraméterei nem egyértelmûen adott, hogy kimenõk, vagy bemenõk, alkalmazástól függõen lehetnek kimenõk is, meg bemenõk is. Ez is nagyon sok lehetõséget ad a programozó kezébe.

Mutatok egy egyszerû példát utóbbira.

Legyen bennevan függvény. A paraméterei: 1. egy lista, 2. egy betû, vagy szám, vagy akármi, 3. megadja, hogy hol van a betû, vagy szám, vagy akármi az elsõ listában. Ekkor a függvény sokféleképpen alkalmaztható, pl.:

bennevan([1,2,3],2,Hol).

Hol=2?

Tehát az elsõ sorban megkérdezzük a prolog interpretert, hogy az 1,2,3 listában benne van-e a 2, s Hol. Megkérdi, hogy arra gondoltunk-e, hogy a második helyen. Ha egy pontosvesszõt írunk utána, akkor keres több megoldási lehetõséget is:

bennevan([1,2,3,2],2,Hol).

Hol=2?;

Hol=4;

no.

 

Erre ezt a választ kapjuk, ha pontosvesszõvel kérjük a további válaszlehetõségek keresését.

De ez a függvény ugyanúgy használható másra is, pl.:

bennevan([1,2],Mi,1).

Mi=1?;

no.

 

Magát az eljárást most nem írtam le, hogy hogy néz ki, csak alkalmazásának lehetõségeit.

Link to comment
Share on other sites

  • 2 months later...
  • 1 month later...
Calyd
Nem biztos, hogy nehéz, csak egészen más gondolkodásmódot követel.

Úgymond nem életszerû, legalábbis nekem elég absztraktnak tûnik. Egyébként hol használják ezeket? Szimulációknál? Hálózatelméleti kérdéseknél?

 

Ebben igazad van - teljesen más gondolkodásmodot igényel. Én a hajamat téptem sokszor, amíg ezt tanultam - szerencsére [vagy inkább sajnos] csak pár gyakorlat volt belõle meg egy zh. Egyébként backtrack elven mûködik. Ezt úgy kell érteni, hogy "szereti az igazságot", éppen ezért mindig igaz visszatérési értékre próbál törekedni. A program tulajdonképpen szabályok, tények sorozata - ezek kiértékelése persze csak hamis vagy igaz lehet. A tény mindig igaz, a szabályokra pedig ún. kérdésekkel lehet "hivatkozni" - ez értékelõdik ki. És vannak benne pl. olyan trükkös, de meggondolva logikus dolgok, hogy a write("tetszõleges szöveg") utasítás azonosan igaz :)

Egyébként az MI témakörében is igen alkalmazott tekintve, hogy képes tanulni. Ezt úgy kell érteni, hogy megadunk neki egy szabály-alakot, és ilyen alakú szabályokból képes magának adatbázist felépíteni.

Hopsz, itt ismét egy érdekesség, amely megadja egy másik kérdésedre a választ [ha jól értettem a kérdést]: nem csak lineárisan lehet benne programozni. A szabályoknak csak az alaklát adjuk meg, s ilyen alakú szabályokból tetszõleges számút alkothatunk.

 

Elméletileg még objektumorientált változata is létezik.

 

Ja igen, és a kérdésem :) Nincs prologban (Turbo ProLog 2.0) olyan eljárás, ami billentyûlemonyásra reagál? Valami readkey vagy ilyesmi?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...