|
|
Ez a prolog szerintem nem valami gyors, legalábbis abból a végrehajtási mechanizmusból ítélve, amit nekünk tanítottak. Viszont valamelyik másik nyelvet (talán CAML) állítólag robotok irányítására is használják, ahol viszont hard realtime követelmények vannak. (Szerk.: és nemcsak hard realtime, hanem a rendelkezésre álló idő is elég kicsi.)
|
|
|
értem, köszönöm a válaszokat.  - az MMF is így működik nagyrészt egyébként(néhány dolgot leszámítva, amiket kattintgatással is elérhetsz), szóval nem volt annyira ismeretlen, csak éppen nem tudtam, hogy ez is nagyon hasonló. Sebességre ez milyen amúgy? Meg mivel érdemes összehasonlítani egyáltalán?
C4Ninja
|
|
|
Az idézetből kimaradt egy link, ami fontos.
8 királynő
A lényegi rész mindössze ennyi: ( % a comment jele)
Kód: nocheck(_,[]).
nocheck(X/Y, [X1/Y1 | Rest]) :- X=\=X1,Y=\=Y1,
abs(Y1-Y) =\= abs(X1-X),
nocheck(X/Y,Rest).
legal([]).
legal([X/Y | Rest]) :-
legal( Rest),
member(X,[1,2,3,4,5,6,7,8]),
nocheck(X/Y,Rest).
nocheck(_,[]). -> ez azt jelenti, hogy a nocheck (nem fenyegetik egymást a királynők) kijelentés igaz bármilyen elemre, ha egy üres lista van mellette. Az _ a bármi, a [] az üres lista. Mindig a megfelelő predikátumot illeszti (akár többet is megpróbálhat, hogy kihozza az eredményt), ezt akkor fogja illeszteni, ha a lista kifogyott.
A másik nocheck azt mondja, hogy egy X/Y párosra (királynő pozíciója) akkor lehet igaz, ha azok nem ütik a soron következő királynőt, valamint az összes többit sem. Jól látszik a rekurzió.
A prolog listakezelése úgy működik, hogy van a listának feje és farka, a fej egy elem, a farok a többi. Egyszerre több fejet is meghatározhatunk.
üres lista: []
egy elemű lista: [fej]
egy egy legalább egy elemű lista [fej | farok]
legalább két elemű: [fej1 | fej2 | farok]
A legal az üres listára mindenképpen igaz.
Illetve akkor igaz, ha az első elemre igaz a nocheck, az X 1-8 közé esik, valamint a többi elemre is igaz. Itt is el fog fogyni a lista, és a végén üres listára igaz lesz.
A trükk, hogy a következtetés akkor történik, amikor megkérdezzük, hogy mondjon egy olyan X listát, aminek az elemeire igaz a fenti állítás. A nem beidézett kódban szépen kitöltögeti az Y értékeket (arra nem volt megkötés, de tudjuk, hogy minden sorba kerül királynő, így adhatunk neki olyan listát, ahová csak X-et kell neki találnia), és erre a listára kéri az X értékeket, ráadásul az összeset. Alapból egyet mondana, és kérésre többet is.
De írok egyszerűbb saját példát, rokonság:
Kód: Apa("Sanyi","Józsi"). % Sanyi apja Józsi
Apa("Feri","Sanyi"). % Feri apja Sanyi
Apa("Géza","Sanyi"). % Géza apja Sanyi
Nagyapa(A,B):- Apa(A,X), Apa(X,B). % A akkor nagyapja B-nek, ha van egy X, aki B apja, és akinek A az apja
Testver(A,B):- Apa(A,X), Apa(B,X). % akkor testvérek, ha közös az apjuk
Az első három azok alap igazságok, a másik kettő pedig általános szabályok. ennél összetettebbek is lehetnek, de már itt is látszik, hogy egy olyan parancsra, hogy Apa(X,"Sanyi"  . két klóz is illeszkedik, és X értékének két végeredményt is adhat.
If your game idea starts with the story it’s not a game idea.
Stories in games are optional.
|
|
|
Lényegében arrol van szo, hogy a programodat logikai formulákkal fogalmazod meg.
Most csak clipses példát tudok mondani (igen az a ronda).
Kód: (defrule kerdezmilyen "Milyen gepet akar"
?f <- (milyen ures)
=>
(retract ?f)
(printout t crlf)
(printout t "Asztali vagy hordozhato gepet szeretnel? (asztal,hordoz)")
(printout t crlf)
(bind ?milyen_ertek (read))
(assert (milyen ?milyen_ertek))
)
Mivel a hihetelenül ocsmány szintaxis miatt nemtudtam megcsinálni a keresztrejtvény megoldó progit, ezért csináltam ilyen bugyuta milyen szgépet akarsz venni cuccot. Ebbe semmi marhaság nemkell.
Ez a clips konkrétan valami olyasmi, hogy vannak tények és vannak szabályok, aztán ezekböl szabályalapu következtetéssel kihoz valamit (megnemmondom hogy elöre vagy visszafele halado, de asszem vissza).
|
|
|
A barátom azt mondta, kérdezzem meg a barátnőmet, és ő ezt mondta: http://en.wikipedia.org/wiki/Declarative_programming
Szerk: egy teljesen triviális példa, ami csak az alaplogikát mutatja:
Kód: jftag(kettoSD).
jftag(wtoma).
jftag(matzi).
level(kettoSD, 1).
level(wtoma, 42).
level(matzi, 1).
jfmodi(X) :-
jftag(X),
level(X, A),
A > 40.
Ezután megkérdezzük, hogy: jfmodi(wtoma). mire közli, hogy 'yes', vagy jfmodi(kettosd) amire azt mondja, hogy 'no'. De azt is kérdezhetjük, hogy jftag(X), mire fölsorolja, hogy kik a JF tagok. (Azt a hármat, akit fölírtam).
Ezt a hozzászólást WToma módosította (2009.10.09 13:52 GMT+1 óra, ---)
|
|
|
Megmondom őszintén, életemben nem hallottam erről. Tulajdonképpen miről is van szó, és hogy épül fel ez a.. <az amiről szó van  > - azt leszámítva, hogy 'nem azt mondod meg, hogy hogyan csinálja, hanem hogy mit csináljon.' Esetleg konkrét példával. [valami olyasmivel lehetőleg, amit az olyan seggfejek is megértenek, mint pl jómagam.]
C4Ninja
|
|
|
Matzi
Akkor nem megfelelő az előadó. Mondjuk baromi nehéz értelmes és megoldható méretű feladatokat adni. Más programnyelveken is gond van ezzel (pl nálunk a féléves projektek röhej kategóriásak voltak), a prologot meg még kevesebb területen lehet használni, de ott jól.
Egy egyszerűbb példának egy egyszerű 8 királynő probléma. Ez a kiírás részt leszámítva baromi rövid, kb 15 sor, és akárhány királynőre gond nélkül lefut. Ezt próbáld meg C-ben megírni ennyi sorból. Valamint megjegyezném, hogy nálunk ennél bonyolultabb feladatokat kellett háziként megoldani.
Nyilván ezt is procedurális nyelven írták, szóval minden megoldható Cben is, ami prologban, de azért nem mindegy milyen gyorsan és jól. Ráadásul ez elég univerzális. Van nálunk egy tárgy, az a címe, hogy nagy hatékonyságú logikai programozás, ahol még pár hatékonyabb eszközt meg lehetett ismerni. Mondjuk nem végeztem el, de érdekesnek hangzik.
|
|
|
Prolog, Haskell, Erlang, és társaik...
A gumiszobában nagy sikere volt
|
|
|
Legújabb project:
Szókirakó 3
Legutóbb frissített project:
Szókirakó 3
Friss kép a galériából:
|