Mesterséges Intelligencia: Prolog, Lisp

Segítség a rekurzív bejáráshoz

Sziasztok!
Van egy prolog programom amiben vannak állítások a következő képpen:
gyereke(X,Y) ahol X-nek gyereke Y.
A feladat az lenne a programban, hogy faszerűen kiiratom a családfát.
Nagyjából kitaláltam már, hogy hogy kéne, csak jelenleg kicsit szenvedek a programmal.
Szeretnék egy olyan részt csinálni ahol egy adott szülönek az összes gyerekét bepakolja egy listába.
így probáltam:
gyereklista(X,LISTA):-gyereke(X,Y),append(Y,LISTA,LISta).
Nyílvánvalóan nem jó, hisz valahogy rekurzivan kéne ezt megoldani....igy most csak egy gyerek nevet rak be kábé 5-ször a listámba.
Viszont nem tudok rekurziót kitalálni rá, illetve eddig nem tudtam.
Van valakinek ötlete?

A válaszokat előre is köszönöm!

gnu prolog vs. gnu emacs

Üdv mindenkinek!

A topicot a hátha hasznos lesz még valakinek! felkiáltással nyitottam arról,

hogyan integrálható be a gnu-prolog a gnu-emacsba, azon esetben, ha mindkettő apt-get installal (vagy dpkg-t használva) lett felpakolva

UBUNTU-hardy synapticból felrakott GNU-emacs -be GNU -prolog integrálása

1. Keresd meg az emacs INIT-file-ját : /usr/share/emacs22/site-lisp/debian-start.elc (emacs22 helyett más gnu verziókkal is műxik - emacs22 helyet más van ott :-) )
_lényeg_: meg kell bütykölni a lisp-ben írt startup fájlját az emacs - szerkesztőnek

2. Másold a home könyvtáradba (ha kell,használj sudo-t)

3. emacs -f batch-byte-compile -batch &lt home könyvtárba másolt fájl &gt (ha kell,kiterjesztés nélküli névre is átnevezheted)

4. másold be az alábbi kódrészletetet. honlapról: http://bruda.ca/emacs-prolog/install.html
innen:


(autoload 'run-prolog "prolog" "Start a Prolog sub-process." t)
(autoload 'prolog-mode "prolog" "Major mode for editing Prolog programs." t)
(autoload 'mercury-mode "prolog" "Major mode for editing Mercury programs." t)
(setq prolog-system 'swi)
(setq auto-mode-alist (append '(("\\.pl$" . prolog-mode)
("\\.m$" . mercury-mode))
auto-mode-alist))

ahová a (setq prolog-system 'swi) sorba 'swi helyett 'gnu írandó.

5. az így módosított fájlt helyezd át az eredeti helyére,az eredeti nevével (nálam ez /usr/share/emacs22/site-lisp/debian-start.elc)

6. indítsd újra a gépedet;

7. ezután már csak explicite meg kell mondanod az emacsnek, hogy prolog (.pl kiterjesztésű) fájlt akarsz vele szerkeszteni

pl: emacs first.pl

8. Dőljhátra, és élvezd! :-)))

prolog, gráf beolvasása

Üdv Mindenkinek!
Egy külső fájlban elhelyezett szomszédsági mátrixból szeretném megvalósítani az köv adatszerkezetet: graf([Csucsok,...],[elek(Csucs1,Csucs2,Ertek),...]).
A fájlban levő adatok elrendezése:
2
0 1 1 1
ahol a 2 a mátrix mérete, a második sor pedig a szomszédsági mátrix.
Az egyik gond "space" elválasztás, a másik a listába beszúrás. A fájl megnyitása, és az adatok egyenkénti beolvasása megy, de a listába nem sikerul beszúrni.
Sajnos minden ötletből kifogytam, és nem is találok hasonlót az interneten.
Köszi:Zoli

Logo programozás

Hali!

Tud valaki használható leírást ("tankönyvet") a Logo nyelvről? Nem elsősorban a teknőcgrafikai része érdekel, hanem a Lisp-re emlékeztető szintaxisú "egyéb" részei. Ráadásul háklis vagyok, és nem a mindenféle csili-vili (Comenius Logo, meg Imagine Logo, stb.) érdekel, hanem a(z egyébként nem szabványosított) eredeti nyelv. Jelenleg a Berkeley Logo-val játszadozom (a multiplatformság mintaképe: FreeBSD, Linux, Windows, Mac alatt futtatható), de egyedül a "User's Manual" van meg, az meg nem kifejezetten programozói szemszögből magyarázza a dolgokat, így kicsit olyan, mint francia szótárból (és nem nyelvkönyvből) franciául tanulni. Megtehető, de lassúkás.

Neuralis halozat - ismeretlen adat

A kovetkezo problemara keresek valamilyen neuralis halozat strukturat, vagy modszert:

Vannak meresi adatok, es van valami elvart kimenet. Erre szeretnek tanitani egy neuralis halot (ellenorzott tanulassal). Sajnos a dolog jellegebol adodoan nem mindig van 1-1 bemeneten adat. Vagy azert, mert akkor meg egyaltalan nem mertuk, vagy azert, mert epp hianyzik. A felismeresi szakaszban is elofordulhat olyan, hogy az egyik bemenet ismeretlen.
Tobbretegu perceptronra gondoltam (szigmoiddal), de ha van jobb, ebbol tudok engedni.

Mivel a meresi adatok pozitiv szamok, nagyon elutne, ha egyszeruen 0-at adnek a bemenetre arra az idore. Foleg azert, mert a tenyleges ertek valahol a legutobb mert ertek korul lehet (mar ha volt ilyen).

Azzal megkerulom a problemat, ha azon a szakaszon, ahol meg nem volt meres - visszamenoleg - kipotolom az elso meres eredmenyevel. Illetve a nem mert szakaszon a ket pont kozt linearisan interpolalom.

A kerdesem az lenne, hogy van-e valami olyan modszer, amivel a neuralis halo olyan modba kerul, hogy nem figyel arra a bemenetere (mas struktura, mas tanitasi modszer peldaul).

LISP vs alkalmazásfejlesztés

LISP alkalmazásfejlsztésről

Előre leszögezem nem vagyok nagy LISP guru, így nem biztos meg tudok majd válaszolni minden kérdést. A csapat gerincét adó három ember tudása e téren nagyságrendekkel nagyobb, mint az enyém, azonban sajnálatos módon hiába unszolom őket nem nagyon foglalkoznak azzal, hogy a magyar informatikusokkal megismertessék az eddigi eredményeket. (Azért remélem majd ők is néha-néha válaszolnak az érdeksebb kérdésekre)

(ExBMEs-ek csak annyiban igaz, hogy a fele csapatt ott végzett elég régen, de semmi közünk nincs a NEPTUN-hoz.)

Alkalmas-e "hatékony" (olcsó, gyors és minőségi) alkalmazásfejlesztésre a LISP?

Első megközelítésben a válasz: igen. Mivel a nyelvi alapokat nézve az egyik legjobb programozási nyelv, várható, hogy bármely más programozási nyelvben megoldott feladatot hatékonyabban lehetne megoldani LISP-ben.
Kicsit mélyebben viszgálva a kérdést a válasz: nem.
Nincs olyan általánosan elterjedt/kiforrott fejlesztési framework, ami lehetővé tenné a hatékony munkát. Nincs elég képzett fejlesztő, aki ha lenne is ilyen framework, tudná azt használni. Van természetesen a piacon jópár LISP-es framework (példának okáért http://www.franz.com/products/allegrocl/) de ezek még nem elégítenek ki jópár egyéb követelményt ahhoz hogy igazán hatékony lehessen.
Az általános nem válasz azonban kisebb csoportok, konkrét esetekben mégis igen lehet.

2 éve, amikor a többiek belevágtak a munkába az első igen válasz alapján az volt a mondás (valami ilyesmi vezérgondolat volt, ha jól emlékszem): "Sokat láttunk, sok mindent ismerünk és azokhoz képest a LISP-pel való munka annyival jobb, hatékonyabb, szebb és szórakoztatóbb, hogy a továbbiakban mással nem szeretnénk foglalkozni. Mivel jó fejlesztők vagyunk feltesszük, hogy egy problémát, ha meg lehet oldani más eszközzel, akkor az LISP-ben is meg tudjuk; természetesen jobban, hatékonyabban, szebben és szórakoztatóbban."
A második nem válasz miatt azonban ehhez szükség van egy alkalmas eszközre, amit mivel nincs ilyen még létre kell hozni. Ennek eredménye a cl-dwim framework. Magáról a framework-ről, de méginkább a mögötte lévő koncepciókról oldalakon keresztül lehetne beszélgetni (jómagam 20 éve programozgatok, 10 éve komolyan vállalatirányítási rendszerfejlesztéssel foglalkozom, de ilyeneket még nem pipáltam!).
A harmadik igen válaszra bizonyíték az említett alkalmazás létrejötte, aminek köszönhetően mi magunk egyben az első igen válasz helyességét is bizonyítottnak látjuk már. Sajnos a második "nem" megszűn(tet)ése még váratni fog magára.

A projektről röviden:
A megoldással szemben támasztott három olyan felhasználói követelmény, ami miatt más technológiát "nem kicsit" fájdalmasabban lehetett volna csak alkalmazni:
1. felhasználó által szabadon definiálható számítási képlet alapján kalkulációkat végezni.
2. a megadott képletek alapján adattárház jellegű kalkulációt (ROLLUP) kell végezni emberileg kivárható időn belül
3. gyors, olcsó és minőségi megoldásra volt szükség :)

1. DSL
Magában a LISP-ben a DSL, mint fogalom közvetlenül meg sem jelenik, annyira evidencia, hogy LISP-ben való programozás egyben magának a programozási nyelv bővítését is jelenti.
Más nyelvekben a projekt ezen követelménynek való megfeleléshez jó eséllyel egy komplex interpretert kellett volna írni. Esetünkben a második megbeszélésen (1 hét múlva) mi egy működőképes prototípussal jelentünk meg, amiben olyan fícsörök is voltak már, hogy "ékes" magyarsággal kiírja a kalkulációs szabályt (fél nap volt összedobni az egészet - és nem interpretáltként fut, hanem compiledként, ami a többi követelménynél létfontosságú).

2. skálázhatóság
Igaz, hogy az elején csak halvány elképzelések voltak a konkrét megvalósítást illetően, de nem láttuk technológiai akadályát egy olyan architektúrának, ahol több gép párhuzamosan képes dolgozni a feladatokon (ez egyben a 3. pont olcsóságához is szükséges vala). Részben tehát a projekt alatt született meg a most már framework részét képező node/cluster/worker fogalomkör, aminek köszönhetően az említett hardver működik. Ha kell bővíteni, akkor az csak annyit jelent, hogy rá kell dugni a plussz gépet és már meg is :)

3. hatékonyság
3a gyorsan legyen meg. Volt cirka 3 hónap a tervezésre/fejlesztése/tesztelésre. Belefértek a skacok :), annak ellenére, hogy a munka során a fejlesztési erőfeszítések egy jelentős része a framework új fícsörökel való felruházására lett fordítva.
3b olcsó legyen. Open source szoftverekben (azaz járulékos szoftverköltségek nélkül), mainframe nélküli rendszerben (azaz nem ár/teljesítmény szempontjából rossz hardverben) kellett gondolkodni. Az alkalmazás teljes költsége a megoldott problémakör méretéhez/komplexitásához és az informatikai iparágban jellemző árszabásokhoz képest töredék.
3c minöségi legyen. A rövid fejlesztési idő ellenére azt hiszem minden kivánság ki lett elégítve. A technológia rugalmasságának köszönhetően olyan változáskéréseket is befogadtunk (pár héttel/nappal az indulás elött), amiket jellemzően nem szokás.

Úgy egyébként az alkalmazásfejlesztés menete felrugott minden iparági szabványt. Ennek oka nem az, hogy azokra nem volt idő, hanem az, hogy az alkalmazott technológia új utakat is megkövetel. Nem volt szükségünk különféle, inkább terhes, mint hasznos módszertanokra. Helyette olyan szinten közös csapatként dolgoztunk együtt a megrendelővel, beengedve őket a fejlesztés minden lépésébe, hogy egy ügyféloldali új igény, vagy változást olyannak tekintettünk mintha azt mi találtuk volna ki. Prototípusos fejlesztés netovábbja volt. Mivel dokumentációt maga a rendszer képes előállítani magáról (egyeddiagramokkal, szövegesen), nem volt szükség úgymond előzetes specifikációra (amit aztán költségesen karban is kell tartani). Helyette ha bármi változott, akkor lekérhető az aktuális állapotnak 100%-osan megfelelő.

CL-DWIM projektről:
http://common-lisp.net/project/cl-dwim/