Prolog: Diferi inter la revizi

De Wikipedio
Kontenajo efacita Kontenajo adjuntita
Lineo 212: Lineo 212:
[[hu:Prolog programozási nyelv]]
[[hu:Prolog programozási nyelv]]
[[id:Prolog]]
[[id:Prolog]]
[[is:Prolog (forritunarmál)]]
[[it:Prolog]]
[[it:Prolog]]
[[ja:Prolog]]
[[ja:Prolog]]
Lineo 224: Lineo 225:
[[ru:Пролог (язык программирования)]]
[[ru:Пролог (язык программирования)]]
[[sk:Prolog]]
[[sk:Prolog]]
[[sl:Prolog]]
[[sv:Prolog]]
[[sv:Prolog]]
[[th:ภาษาโปรล็อก]]
[[th:ภาษาโปรล็อก]]
[[tr:Prolog]]
[[tr:Prolog]]
[[uk:Пролог (мова програмування)]]
[[zh:Prolog]]
[[zh:Prolog]]

Versiono ye 16:13, 3 di agosto. 2008

Prolog esas uno di precipua lingui di logika programeso. La nomo Prolog esas franca akronimo di PROgrammation LOGique. Ol esis kreita da Alain Colmerauer, Philippe Roussel e Robert Kowalski proxim 1972. La skopo esis di facar linguo di programeso qua permisus uzar l’expresiva di logika vice definar pazope la sequencio di instruktesi qua devas exekutar l'ordinatro.

Prolog esas uzita en multa programi d’artificala intelekto ed en la trakte dil linguistiko per ordinatiero (precipue to koncerninta la naturala lingui). Lia sintaxo e semantiko es considerita kom tre simpla e klara (la skopo esis di prokurar utensilo per la linguisti ne-savinta l’informala). Multe di inquesti duktinta al aktuala instalo de prolog venus di efektis di projeti per l'ordinatieri dil kinesma generaciono ke uzis kom bazo vario.

Prolog esas bazala sur la kalkulo di predicati di unesma rango ; tamen ol esas restriktar ad aceptar sole la klauzi de Horn. L’exekuto di Prolog programo esas efektive apliko di teorio provinta per rezolvo di unesma rango. La fondamenta koncepti esas l’uneso, la recurzivita, e la retro-veno sur traco]].

Tipi di donaji

Prolog ne uzas tipi di donaji en la ordinara maniero di lingui di programo. Ni devas parlar lore to okazione di lexika elementi.

Atomi

La konstanta texti esas en-duktita per la moyeno di atomi. Atomo esas sequo konzistinta en letri, nombri e sub streki, ke komencas per minuskula letro. Principe, se atomo ne-alfanumerala esas necesa ol esas cirkondita per dil apostrofi (per exemplo '+' esas atomo, + esas operacanto).

Nombri

La plumulteso di prolog instali ne facas diferanta inter di integra e reala nombri.

Variani

La variani esas indikita en uzinta ensemblo di letri, nombri e sub-strekiza signi e komencinta kun majuskula letro. En l’ambiento Prolog, variano ne esas kontenanto, qua povas esar asignita (a l’inversa di lingui di programeso de proceduro). Sua konduto esas plu proxim di forma, qua esas plus specifita per l’unieso.

L' anonima varino esas skribita kun sub-strekiza (_).

Termini

La termini esas la sola fasoni do Prolog povas riprezentar di komplexa donaji. Termino konsistas en kapo, anke nomita foncto (ke povas esar atomo), e di parametri (sen restrikto di tipo). La nombro di parametri, anke nomita arito di termino, esas sencala. Termino esas identigita per sua kapo e sua arito, ofte skribas kom funcionero/arito.

Listi

Listo ne esas tipo di izolata donaji, nam ol esas definita per recursiva konstrukto (uzinta termino '.'/2) :

  1. atomo [] esas vakua listo
  2. se T esas listo e H esas elemento, lore termino '.'(H, T) es listo.

La prima elemento, nomita la kapo, esas H, qua esas sequas per la kontenita di ceteri dil listo, indikita kom T o kaudo. La listo [1, 2, 3] esus riprezentita en interna kom '.'(1, '.'(2, '.'(3, []))) Plu korto di sintaxo es [H | T], qua e precipue per konstructar di normi. La totala di listo povas esas traktita en operacinta la prima elemento, e seque la cetero dil listo, per ricursiono.

Per la facileso di programero la listi povas esar konstructita e dekonstructita da diversa manieri.

  • Elemento enumero: [abc, 1, f(x), Y, g(A, rst)]
  • Des-kompozar en sole elemento: [abc | L1]
  • Des-kompozar en di multa elementi: [abc, 1, f(x) | L2]
  • Expansio di termino: '.'(abc, '.'(1, '.'(f(x), '.'(Y, '.'(g(A, rst), [])))))

Kateni di signi

La kateni di signi esas generale skritita kom sequo di signi cirkondita per di apostrofi. Ol esas ofte reprezentita en interna per listo di kodexo ASCII.

Fakti

La programeso en Prolog esas tre diferanta del programeso en imperala lingui. En Prolog, vi alimentas bazo di donaji di fakti e di normi; vi povas lore facar di questioni ala bazo di donaji. L’uneso di bazo de Prolog esas la predicato, ke esas definita kom esinta vera. Predicato konzistas en kapo e nombri di argumenti. Per exemplo:

kato(tom).

Hike 'kato' esas la kapo, e 'tom' esas l’argumento. Yen kelka simpla questioni ke vi povas demandar ad interpreto bazita sur ta fakto:

?- kato(tom).
     yes.
?- kato(X).
     X = tom;
     non.

La predicati esas en generale definita per expresar kelka fakto ke la programo konocas okazione di mondo. En la plu-multeso queras ul-konvenciono. Do, ke versiono di du predicati sube volus signifikar ke Pat es la patro de Sally?

patro(sally, pat).
patro(pat, sally).

Ambe kazo 'patro' esas la kapo dum ke 'sally' e 'pat' esas la argumenti. Tamen en la prima kazo, Sally venas unesma en la listo di argumenti, ed en la duesma to es Pat (la rango en la listo di argumenti importas). La prima kazo esas exemplo di defino en la rango verbo-subjeto-objekto, e la duesmo di verbo-objekto-subjeto. Kom Prolog ne komprenas la naturala linguo, la du versioni esas korekta en to ke li koncernas; tamen to esas bona stilo de programeso ke di mantenar kohero di konvenciono en programo.

Kelka predicati esas establisita en la linguo e permisas prolog programo di facar di activitita di rutino (kom la eniro/ek, uzar la grafika interfacio e generale komunicar kun la sistemo dil ordinatiero). Per exemplo la predicato write povas esar uzita per l’afishigo ala skreno. Do

write('Bonveno')

prezentos la verto 'Bonveno' ala skreno.

Normi

La duesma tipo di instrukti en Prolog esas la normo. Exemplo di normo esas

lumo(on) :- interruptilo(on).

La « :- » signifikas « se »; ta normo indikas lumo(on) esas vera se interruptilo esas vera. Normi povas anke uzar di variani kom

patro(X,Y) :- gepatro(X,Y), maskulo(Y).

To ke significas « se kelko esas la gepatro di altra kelko e to esas maskulo, oli esas do la patro ». L’antea e konsequanta esas en l’inversa normo di to ke trovas normale en logika. Ol esas posibla di pozar di multa predicati e konseque, grupita kun uniono « e », per exemplo:

a, b, c :- d.

ke esas simple la equivalanto di tre separa normi, tamen la tri separa normi ne esas equivalanto di (a e b e c) se d, pro ke ol questionesas di uno « o » inkluzanta:

a :- d.
b :- d.
c :- d.

To ke ne esas permisita esas di normi kam:

a;b :- c.

to qua esas « se c lore a o b ». To esas pro dil restrikto per la klauzo de Horn.

Evaluo

Kande l’interpreto recevas demando ol probas di truvar di fakti ke korespondas ala questiono. Se irga simpla fakto es disponebla, ol probas di kontentigar omna la normi ke havas la fakto kom konkluzo. Per exemplo havas to kodexo Prolog.

fratulo_o_fratino(X,Y) :- gepatro(Z,X), gepatro(Z,Y).
patro(X,Y) :- gepatro(X,Y), maskulo(X).
matro(X,Y) :- maskulo(X,Y), femino(X).
gepatro(X,Y) :- patro(X,Y).
gepatro(X,Y) :- matro(X,Y).
matro(trude, sally).
patro(tom, sally).
patro(tom, erica).
patro(mike, tom).
maskulo(tom).
femino(trude).
maskulo(mike).

Ol kam rezultas ke la sequa demando esas evaluita kom vera:

?- fratulo_o_fratino(sally, erica)
     yes.

L’interpreto par-venas a to rezulto kam facinta korespondar la normo fratulo_o_fratino(X,Y) per kun-pozinta (preciza substitucinta) sally a X e erica a Y.

To signifikas ke la demando povas esar extensita a gepatro(Z,sally), gepatro(Z,erica). Igar korespondar ta uniono esas obtenita kam vidinta omni la posibla gepatro di sally.
Tamen, parent(trude,sally) ne duktas a vivatra solvo, per ke se trude esas substitucita per Z, gepatro(trude,erica) devus esar vera, e irga fakto tala (o kelka normo qua povas kontentigar to) ne esas prezenta. Anke ala loko, tom es substitucita per Z, e erica e sally aparas esar fratulo_o_fratino tamen.

matro(X,Y) :- gepatro(X,Y), femina(X).
gepatro(X,Y) :- patro(X,Y).

povas semblar suspekt. Sume omna gepatro ne esar patro. Ma ol es vera ke omna patro es gepatro. Di altra parto, kelko esar la matro di un ke se el esas sam-tempe sua gepatro e femina.

Per indikar ke omna la patri es maskulo vi havas bezono di kodexo

maskulo(X) :- patro(X,_).

to ke simple esas indiferenta a qua esas la filio (la sub-strekiza esas la anonima varino).

Nego

Tipe, demando esas evaluita kom falsa per la merito di ne truvar di pozitiva normi o fakti qua suportas la stato. To esas apelita la premiso di kloza monda; on konsideras ke omna to qua devas esar konocita esas inkluzas en la bazo di donaji, lore ol ne esas di externa mondo ke povus kontenar la ne-konocata pruvi. En altra termini, se fakto ne esas konocata kom esinta vera (o falsa) ol esas konsiderita kom falsa.

Normo kam to

legala(X) :- NOT nelegala(X).

povas sole esar evaluita kam inquestinta exhaustante per omna la nelegala kozi, la komparinta a X, e se irga fakto nelegala povas esar truvita kom la mem ke X, X esas legala. To esas apelita nego per falio.

Exekuto

Prolog esas logika linguo, anke kam teorio vi ne devus vi pre-okupar di kome ol exekutas su.

Tamen ol esas kelke foye prudenta di prenar en konto kome l’algoritmo di infero agas, per evitar ke Prolog programo duras tro longe.

Per exemplo, ni povas skribar di kodexo per kontar la nombro di elementi de listo.

elemi([],0).
elemi([H|T], X) :- elemi(T, Y), X esas Y + 1.

To signifikas simple; se la listo es vakua, la nombro di elementi esas zero.
Se listo ne esas vakua, lore X esas augmentita di un per raporto a Y, qua esas la nombro di elementi en la cetero del listo sen la prima elemento.

En ta kazo, ol havas clara distingo inter la kazi en l’antea en la normi. Ma konsiderar la kazo ube vi havas bezono di decidar se vi continuas a ludar en cazino;

mizar(X) :- havarpecunio(X).
mizar(X) :- havarkredito(X), NOT havarpecunio(X).

Se vi havas dil pecunio, vi kontinuas a mizar. Se vi havas omne perdita vi havas bezono di pruntar, o se ne ... plu di pario. havarpecunio(X) povas esar funciono tre kustozo, per exemplo, se ol povas acesar a vua banca konto per la reto. Ma to esas la mem kozo per havarkredito.

En teorio, la instaluro di Prolog povas evaluar ta normi en irga ordino, anke vi povus anke bona havas skritas;

mizar(X) :- havarkredito(X), NOT havarpecunio(X).
mizar(X) :- havarpecunio(X).

To ke esas bona, per ke amba questioni exkluzar su l'una l'altra. Tamen verifikinta se vi povas obtenar presto ne esas necesa se vi savas ke havas pecunio. Anke en praktiko, la instaluro di Prolog testos la normo ke vi havas skritita prima.

Vi povas uzar l’operacero cut per dicar a l’interpreto di saltar la duesma selekto se la prima suficas. Per exemplo:

mizar(X) :- havarpecunio(X), !.
mizar(X) :- havarkredito(X), NOT havarpecunio(X).

To esas apelita operacero di haltigo verda. La ! dicas simple a l’interpreto di ne plu serchar d’alternativo. Ma vi notez ke se vi havas bezono di pecunio ol havas bezono di evaluar la duesma normi, e oli feras. Testinta per havarpecunio en la duesma normo esas prefere ne-utila nam vi savas ke vi ne havas, segun la duesma normo ne esus evaluita prima. Anke vi povas chanjar la kodexo en:

mizar(X) :- havarpecunio(X), !.
mizar(X) :- havarkredito(X).

To esas apelita operacero di haltigo reda, per ke ol esas danjerozo di facas to. Vi esas nun dependinta di korekta poze di operacero di haltigo et la rango di normi per determinar la logika senso. La acidenti di tranchar-e-glutinar guatas en la obskura anguli. Se la normi esas mixita, vi povas nun uzar vua kredito-karto ante di spensar vua disponebla pecunio.