"Prologs" ir programmēšanas valoda jeb mākslīgā intelekta pamats. Loģiskā programmēšana. Prolog valodas pamati Kur tiek lietots prologs?

Kāpēc viņš ir pārsteidzošs? Es zinu pāris desmitus valodu, un man nav problēmu apgūt vēl vienu jaunu, vienkārši vairs neredzu vajadzību.

Prologs ir unikāls. Tā ir vienīgā valoda, kas pārstāv deklaratīvās programmēšanas paradigmu; tā ir valoda, kurai ir simtiem dažādu implementāciju, taču tās joprojām sauc par Prolog, nosaukumam pievienojot tikai prefiksus un sufiksus; tā ir dzīva valoda, kurā vairāk nekā 20 gadus nav notikušas būtiskas izmaiņas; Šī, iespējams, ir vienīgā programmēšanas valoda, kas ir tik populāra un kurai nav pielietojuma reālajā programmēšanā. Kāpēc Prolog?

Prologam ir unikāls raksturs, tas parādījās laimīgas sakritības dēļ (noslēpumainā pasaules uzbūve). Kādreiz 60. gados automātiskās teorēmu pierādīšanas teorija attīstījās ļoti strauji, un Robinsons ierosināja izšķirtspējas algoritmu, kas ļāva pierādīt jebkuru patiesu teorēmu (atvasināt to no aksiomām) ierobežotā laikā (kurā tā nav). zināms). Kā izrādījās vēlāk, tas ir labākais risinājums vispārējai problēmai, teorēmu nav iespējams pierādīt ierobežotā darbību skaitā. Vienkāršiem vārdiem sakot, algoritms ir (parasti bezgalīga) grafa šķērsošana ar platumu. Protams, algoritma darbības paredzamība ir praktiski vienāda ar 0, attiecīgi tas absolūti nav piemērots programmēšanas valodai. Un tajā brīdī Kalmarovs atrada izcilu problēmas sašaurināšanos, pateicoties kam dažu teorēmu pierādīšana izskatījās kā programmas procesuāla izpilde. Ir vērts atzīmēt, ka pierādāmo teorēmu klase ir diezgan plaša un ļoti labi piemērojama programmējamo problēmu klasei. Tā 1972. gadā radās Prolog.

Šajā rakstā es mēģināšu runāt par Prolog kā līdzekli vispārīgu loģisku problēmu risināšanai. Šī tēma būs interesanta tiem, kuri jau zina Prolog sintaksi un vēlas to saprast no iekšpuses, kā arī tos, kuri absolūti nezina valodas sintaksi, bet vēlas saprast tās “mielību”, netērējot papildu laiku. sintaktisko struktūru apguve.


Prolog galvenā iezīme ir tā, ka tas var būt viegli lasāms, bet ļoti grūti rakstīt, kas būtiski atšķiras no visām galvenajām valodām, kuras saka, ka rakstīšana ir kļuvusi vēl vienkāršāka, vēl viens solis un jūs varat rakstīt planšetdatorā, velkot kas darbojas kā draugi pakalpojumā Google+ , mēs visi zinām, ka no tā ļoti cieš paša koda kvalitāte. Šķiet, ka katra rindiņa ir skaidra, bet kā sistēma darbojas, pat izstrādātāji nesaprot, kā saka Hindustānā. Man šķiet, ka visās grāmatās par Prolog mācīšanu viņi pieļauj vienu un to pašu kļūdu, sākot stāstu par faktiem, attiecībām, vaicājumiem, un cilvēkam veidojas attieksme pret valodu kā Ekspertu sistēmu vai datu bāzi. Daudz svarīgāk ir iemācīties pareizi lasīt programmas un tādā veidā izlasīt desmitiem to :)

Kā pareizi lasīt prologa programmas

Programmu lasīšana ir ļoti vienkārša, jo valodā ir ļoti maz īpašu simbolu un atslēgvārdu, un tie ir viegli pārtulkojami dabiskajā valodā. Programmētāja galvenā kļūda ir tā, ka viņš vēlas uzreiz iedomāties, kā programma darbojas, nevis lasīt to, ko programma apraksta, tāpēc man šķiet, ka vienkārša cilvēka neapmākotās smadzenes ir daudz vieglāk apmācīt nekā programmētājam.
Jēdzieni
Valodā ir 2 jēdzieni predikāti(nosacījumi) un objektus(tie arī ir mainīgie un termini). Predikāti izsaka noteiktu nosacījumu, piemēram, zaļu objektu vai pirmskaitli; ir dabiski, ka nosacījumiem ir ievades parametri. Piemēram zaļš_objekts(objekts), pirmskaitlis(skaitlis). Parametru skaits predikātā nosaka predikāta aritāti. Objekti- ir termini, konstantes un mainīgie. Konstantes- tie ir skaitļi un virknes, mainīgie- izsaka nezināmu objektu, iespējams, to, kas tiek meklēts, un ir apzīmētas kā līnijas ar liels vēstules. Pagaidām atstāsim noteikumus un apsvērsim vienkāršāko programmu.
Programma
Programma ir formas noteikumu kopums Ja nosacījums1 un nosacījums2 un... tad nosacījums ir patiess. Formāli šie noteikumi tiek apvienoti, izmantojot UN, taču nav iespējams iegūt pretrunu, jo Prolog nav loģiskā nolieguma, un savienojumā That var būt tikai viens predikāts (nosacījums).

A:- B_1, B_2. Noteikums % skan šādi: Ja B_1 un B_2, tad A
nepāra_pirms(skaitlis) :- pirmskaitlis(skaitlis), nepāra(skaitlis).
% Ja "skaitlis" ir pirmskaitļa un nepāra vērtība, tad "skaitlis" ir nepāra_pirmsskaitlis

Kā redzat, mainīgā nosaukumam ir darbības joma - tas ir noteikums. Matemātiski pareizi izklausās noteikums: jebkuram mainīgajam - “Skaitlis”, ja tas ir pirmais un nepāra, tad tas ir prime_odd. Līdzīgi to var pārfrāzēt šādi: Ja ir nepāra un pirmskaitļa “skaitlis”, tad tas ir nepāra_pirmsskaitlis. Tāpēc mainīgā nosaukumam ir ļoti liela nozīme! Ja kreisajā pusē (pirms:-) aizstājam Skaitli ar Skaitli2, tad noteikums mainīs tā nozīmi: Jebkuram Skaitlim2 un Skaitlim, ja Skaitlis ir pirmreizējs un nepāra, tad Skaitlis2 ir vienkāršs nepāra. Izrādās, ka visi skaitļi ir prime_neadd! Šī ir visizplatītākā Prolog kļūda.

A:- B_1, B_2. Noteikums % skan šādi: Ja B_1 un B_2, tad A nepāra_pirms(skaitlis) :- prime(skaitlis), nepāra(skaitlis). % Ja "skaitlis" ir pirmskaitļa un nepāra vērtība, tad "skaitlis" ir nepāra_pirmsskaitlis

Piemērs – ideāli skaitļi
ideāls_skaitlis(N) :- skaitlis(N),_dalītāju_summa_bez_skaitļa(N,dalītāju summa), vienāds ar(dalītāju_summa, H). ideāls_skaitlis(1). vienāds (objekts, objekts). dalītāju_summa_bez_skaitļa(1, 1). dalītāju_summa_bez_skaitļa(Numurs, Summa) :- skaits_iepriekšējais(Skaitlis, Iepriekšējais),_skaita_dalītāju_summa_skaitlis(Skaitlis, Summa, Iepriekšējais). skaitļu_dalītāju_skaits_skaits(skaitlis, 1, 1). skaitļu_dalītāju_summa_skaitlis(skaitlis, summa, dalītājs) :- dalīts_ar(skaitlis, dalītājs), skaitlis_iepriekšējais(dalītājs, iepriekšējais), skaitļu_dalītāju_summa_skaitlis(skaitlis, summaIepriekšējais, iepriekšējais), pievieno(SummaIepriekšējais, Dalītājs, Summa). skaitļu_dalītāju_summa(skaitlis, summa, dalītājs) :- nav_dalāms_ar(skaitlis, dalītājs), skaits_iepriekšējais(dalītājs, iepriekšējais), skaitļu_dalītāju_skaits(skaitlis, summa, iepriekšējais).

Vispirms oficiāli izlasiet, ko nozīmē noteikumi:

  1. Ja “H” ir skaitlis un “H” un “SumDivisors” ir izpildīts nosacījums summa_dalītāji_bez_skaitļa, citiem vārdiem sakot, SumDivisors ir skaitļa “H” dalītāju summa, un “H” ir vienāds ar “SumDivisors”. , tad “H” ir ideāls skaitlis.
  2. 1 ir ideāls skaitlis. Noteikumiem var nebūt nosacījumu, un tādā gadījumā tos sauc par faktiem.
  3. Katrs objekts "O" ir vienāds ar "O". Principā ir standarta predikāts "=", bet jūs varat to pilnībā aizstāt ar savu.
  4. Fakts, ka dalītāju_summa_bez_skaitļa 1 ir vienāda ar 1.
  5. Ja dalītāju summa "Skaitlis" līdz iepriekšējam skaitlim "Skaitlis" ir vienāda ar "Summu", tad šī ir dalītāju_summa_bez_skaitļa. Tādējādi tiek izteikts, ka X dalītāju summa ir mazāka vai vienāda ar Y, jo X dalās ar X, tāpēc mēs pieņemam Y = X - 1.
  6. Tālāk 3 predikāti nosaka dalītāju skaitļu summu, kas ir mazāka vai vienāda ar Y (dalītājs), pirmais gadījums Y ir vienāds ar 1, 2. gadījums Skaitlis dalās ar Y, tad dalītāju_summa(X, Y) = dalītāju_summa(X, Y- 1) + Y , un 3.gadījums Skaitlis nedalās ar Y, tad dalītāju_summa(X, Y) = dalītāju_summa(X, Y-1).
Programma ir kā definīciju kopums
Ir otrs veids, kā lasīt šos noteikumus, mazāk matemātisks un dabiskāks, pamatojoties uz "definīcijām". Varat pamanīt, ka programmā Prolog visi noteikumi kreisajā pusē (toreizējā daļā) satur tikai vienu nosacījumu, kas būtībā ir šī nosacījuma “definīcija”.
Piemēram, pirmais noteikums ir ideālu skaitļu definīcija. "H" ir ideāls skaitlis, ja "H" ir skaitlis un "H" dalītāju summa ir vienāda ar "H". Identiski predikāti tiek grupēti pēc nosaukuma, izmantojot nosacījumu “vai”. Tas ir, jūs varat papildināt definīciju: “H” ir ideāls skaitlis, ja... vai ja “H” ir 1.

Šī lasīšanas metode tiek plaši izmantota, jo tā ļauj apvienot predikātus viendabīgās grupās un palīdz saprast, kādā secībā tulks atritina predikātus, lai
pārbaudiet kāda apgalvojuma patiesumu. Piemēram, ir acīmredzams, ka, ja predikātam nav vienotas definīcijas, tad ar to nav iespējams pierādīt apgalvojuma patiesumu. Piemērā Nr. 1 predikātam “dalīts ar” nav definīcijas.

Interesants fakts ir tas, ka programmā Prolog nav cilpu, nav mainīgo piešķiršanas, nav tipu deklarācijas, un, ja atceramies arī par terminiem un izgriezumiem, valoda kļūst algoritmiski pilnīga.

Termālās pirtis
Termālās pirtis ir rekursīva definīcija kā nosaukta objektu kolekcija. Termins = "nosaukums"(objekts, objekts, ...), piemērs persona ("Vārds", "Uzvārds"), "+"(1, 2), persona (adrese ("Kāda adrese"), uzvārds ("Uzvārds"), tālrunis ("Tālrunis")). Ja mēs uzskatām terminu par matemātisko jēdzienu, tad termins ir funkcija vai precīzāk funkcionors, tas ir, “+”(1, 2) nozīmē, ka ir objekts, kas ir vienāds ar 1+2. Tas nebūt nenozīmē, ka 1+2 = 3, Prologā šī izteiksme nav patiesa, tāpat kā atlikumu grupā modulo 2 3 vispār nepastāv. Atkal no matemātiskā viedokļa Mainīgos savieno vārds For All, un, ja paziņojumā vārds eksistē, tad šim nolūkam tiek izmantots termins (funktoris). Jebkuram skaitlim ir faktoriāls skaitlis: faktoriāls(X, fakts(X)).

No programmēšanas viedokļa terminus var izskaidrot daudz vienkāršāk: termins ir objekts ar atribūtu kopu, atribūti var būt citi termini vai konstantes vai mainīgie (tas ir, nedefinēti). Galvenā atšķirība ir tā, ka visi Prolog objekti ir nemainīgi, tas ir, jūs nevarat mainīt tajos esošos atribūtus, bet ir īpašs stāvoklis - mainīgais.

Piemērs - Veselo skaitļu aritmētika
nat(0). nat(skaitlis(skaitlis)) :- nat(skaitlis). plus(0, Skaitlis, Skaitlis). plus(skaitlis(N1), N2, skaitlis(Res)) :- plus(N1, N2, Res). reizināt (0, skaitlis, 0). reizināt(skaitlis(Ch1), Ch2, Res2) :- reizināt(Ch1, Ch2, Res), plus(Res, Ch2, Res2).
  1. Īpašuma definīcija nat (dabiskais numurs). 0 ir naturāls skaitlis, ja Skaitlis ir naturāls, tad ir objekta numurs(Numurs), kas arī ir naturāls skaitlis. Matemātiski termins “skaitlis” izsaka funkciju +1, no programmēšanas viedokļa “skaitlis” ir rekursīva datu struktūra, šeit ir tās elementi: skaitlis(0), skaitlis(skaitlis(0)), skaitlis(skaitlis (skaitlis(0))).
  2. Plusa attiecība ir 0 + Skaitlis = Skaitlis. Ja Ch1 + Ch2 = Res, tad (Ch1+1) + Ch2 = (Res+1).
  3. Reizināšanas attiecība ir 0 * Skaitlis = 0. Ja Ch1 * Ch2 = Res un Res + Ch2 = Res2, tad (Ch1+1) * Ch2 = Res2.
Acīmredzot šie apgalvojumi ir patiesi parastajai aritmētikai, bet kāpēc tad mēs neiekļāvām tos pašus acīmredzamos apgalvojumus kā Skaitlis + 0 = Skaitlis. Atbilde ir vienkārša: atlaišana ir ļoti slikta pēc jebkuras definīcijas. Jā, tas var palīdzēt veikt aprēķinus, sava veida priekšlaicīgu optimizāciju, bet blakusparādības var būt pretrunas definīcijās, neviennozīmīga paziņojuma izvade un tulka cilpa.

Kā Prolog saprot predikātus un kā pierāda apgalvojumus

Protams, programmu lasīšana palīdz iejusties Prolog stilā, taču no tā nav skaidrs, kāpēc un kā šīs definīcijas var izmantot. Iepriekš sniegtos piemērus nevar saukt par pilnvērtīgu programmu, jo nav pietiekami daudz ieejas punkta. Ieejas punkts Prolog ir vaicājums, kas ir analogs vaicājumam pret SQL datu bāzi vai analogs galvenās funkcijas izsaukšanai funkcionālajā programmēšanā. Vaicājumu piemēri: nat(Skaitlis) - atrodiet naturālu skaitli, plus(0, 0, Result) - atrodiet 0 un 0 pievienošanas rezultātu mainīgajā Result, nat(0) - pārbaudiet, vai 0 ir naturāls skaitlis utt. .

Protams, vaicājumu rezultātus nav grūti paredzēt no loģiskiem apsvērumiem, taču ir ārkārtīgi svarīgi saprast, kā programma tos ieguvusi. Galu galā Prolog nav melnā kaste, bet gan programmēšanas valoda, un atšķirībā no datu bāzes, kur tiek veidots SQL plāns un dažādās datu bāzēs vaicājumu var izpildīt atšķirīgi, Prolog ir ļoti specifiska izpildes secība. Fakts ir tāds, ka datu bāzē mēs pilnībā zinām, kādu atbildi mēs vēlamies saņemt, pamatojoties uz tabulas datiem, diemžēl, skatoties programmas Prolog, ir diezgan grūti pateikt, kuri apgalvojumi ir loģiski izsecināmi, tāpēc tas ir daudz vieglāk lai saprastu, kā darbojas Prolog tulks.

Apskatīsim pieprasījuma piemēru plus(0, 0, rezultāts) :
1. Mēs atrodam šī pieprasījuma atbilstību (sava ​​veida modeļa saskaņošanu, izšķirtspēju) ar viena noteikuma kreiso pusi. Šim vaicājumam plus(0, Skaitlis, Skaitlis). Salīdzināsim visus vaicājuma argumentus ar noteikumu pa vienam un iegūsim: 0 = 0, 0 = Skaitlis, Rezultāts = Skaitlis. Šajos vienādojumos ir iekļauti 2 mainīgie (skaitlis un rezultāts), tos atrisinot, iegūstam, ka Skaitlis = Rezultāts = 0. Tā kā šim noteikumam nav nosacījumu, mēs saņēmām atbildi uz uzdoto jautājumu. Atbilde: jā un rezultāts = 0.

Pieprasīt nat(skaitlis) :
1. Mēs atrodam 1. sakritību ar likumu, nat(0) noteikumu, risinot vienādojumus pēc atbilstības, citiem vārdiem sakot, atrodot izšķirtspēju, mēs iegūstam Skaitlis = 0. Atbilde: jā un Skaitlis = 0.

Pieprasīt plus(rezultāts, 0, skaitlis(0)) :
1. Atrodiet izšķirtspēju ar noteikumu plus(0, Skaitlis, Skaitlis): Rezultāts = 0, 0 = Skaitlis, skaitlis(0) = Skaitlis, bet (!) Skaitlis = 0 = skaitlis(0) - nav iespējams, jo 0 ir tas pats skaitlis (0). Tāpēc mēs meklējam risinājumu ar šādu noteikumu.
2. Atrodiet izšķirtspēju ar noteikumu plus(skaitlis(N1), N2, skaitlis(Res)), iegūstam skaitli(N1) = Rezultāts, N2 = 0, skaitlis(Res) = skaitlis(0), tātad Res = 0 Šie noteikumi, ir nosacījumi, kas mums ir jāpārbauda, ​​ņemot vērā rezolūcijas rezultātus (mainīgās vērtības), plus(Ch1, Ch2, Res) -> plus(Ch1, 0, 0). Mēs atceramies steka mainīgo vērtību un izveidojam jaunu pieprasījumu plus(H1, 0, 0)
3*. Atrisinot vaicājumu plus(Х1, 0, 0), mēs atrodam izšķirtspēju ar plus(0, Skaitlis, Skaitlis) un iegūstam Х1 = 0 un Skaitlis = 0.
4. Mēs atgriežamies pa kaudzi pie iepriekšējiem mainīgajiem Rezultāts = skaitlis(N1) = skaitlis(0). Atbilde tika atrasta numurs(0). Attiecīgi prologa mašīna tagad ir atrisinājusi vienādojumu X + 0 = 1.

Kompetenti sastādīt noteikumus Prolog valodā ir ļoti grūta lieta, taču kompakti sastādot, var iegūt ne tikai tiešas atbildes un risinājumus, bet arī apgrieztus.

Pieprasījuma piemērs plus (skaitlis, cipars, cipars) : atbilde ir jā, skaitlis = 0.

Pieprasījuma piemērs plus(0, 0, 0) : atbilde ir nē, pirmajā mēģinājumā visas rezolūcijas netiek izpildītas.

Pieprasījuma piemērs plus (skaitlis, skaitlis, skaitlis (skaitlis)) : Atbilde ir jā, Skaitlis = 1. Vienādojuma atrisināšana X + X = X + 1.

Mēģiniet izvadīt vaicājumu reizināt (skaitlis, skaitlis (0), skaitlis (0)), tas prasīs mainīgos 2 reizes nospiest kaudzē un aprēķināt jaunu vaicājumu. Prolog mašīnas būtība ir tāda, ka jūs varat izmest 1. rezultātu, tad Prolog atgriezīsies iepriekšējā stāvoklī un turpinās aprēķinu. Piemēram, pieprasījums nat(skaitlis) , vispirms piemēros 1. noteikumu un izvadīs 0, un pēc tam piemēros 2. noteikumu + 1. kārtulu un izvadīs skaitli (0), varat atkārtot un iegūt bezgalīgu visu naturālo skaitļu secību. Vēl viens piemērs, pieprasījums plus(skaitlis, cipars(0), cipars2) , izveidos visu vienādojuma X + 1 = Y risinājumu pāru secību.

Secinājums

Diemžēl saprātīgais tēmas apjoms neļāva man pietuvoties galvenajai tēmai, proti, sarežģītu loģisku problēmu risināšanai Prologā, bez stratēģijas to risināšanai. Lieli Prolog koda gabali var atbaidīt ne tikai iesācējus, bet pat pieredzējušus programmētājus. Šī raksta mērķis ir parādīt, ka Prolog programmas var vienkārši lasīt dabiskā valodā, un izpilda vienkāršs tulks.
Prolog galvenā iezīme ir tā, ka tā nav melnā kaste vai bibliotēka, kas risina sarežģītas loģiskās problēmas; jūs varat ievadīt algebrisko vienādojumu programmā Mathematica, un tas radīs risinājumu, taču veikto darbību secība nav zināma. Prolog nevar atrisināt vispārīgas loģiskās problēmas (tam trūkst loģisko “vai” un “negācijas”), pretējā gadījumā tā izvade būtu nedeterministiska kā lineāra izšķirtspēja. Prologs ir zelta vidusceļš starp vienkāršu tulku un teorēmu pierādīšanas mašīnu; nobīde jebkurā virzienā noved pie vienas no īpašībām zaudēšanas.

Nākamajā rakstā es vēlētos runāt par to, kā tiek risinātas šķirošanas problēmas, par pārliešanas secību, Miss Manners un citām labi zināmām loģiskām problēmām. Tiem, kas jūtas neapmierināti, vēlos piedāvāt nākamais uzdevums (pirmā persona, kas atrisina balvu):
Uzrakstiet predikātu, kas ģenerētu bezgalīgu naturālu skaitļu secību, sākot ar 3. Tiem jābūt standarta skaitļiem programmā Prolog, kuru darbības tiek veiktas, izmantojot predikātu: X ir 3 + 1 => X=4.

Daudzus gadu tūkstošus cilvēce ir uzkrājusi, apstrādājusi un nodod zināšanas. Šiem nolūkiem pastāvīgi tiek izgudroti jauni līdzekļi un uzlaboti vecie: runa, rakstīšana, pasts, telegrāfs, telefons utt. Datoru parādīšanās zināšanu apstrādes tehnoloģijās spēlēja lielu lomu.

1981. gada oktobrī Japānas Starptautiskās tirdzniecības un rūpniecības ministrija paziņoja par pētniecības organizācijas izveidi - Jaunās paaudzes datortehnoloģiju pētniecības centra institūtu. Šī projekta mērķis bija izveidot uz zināšanām balstītas informācijas apstrādes sistēmas. Tika pieņemts, ka šīs sistēmas nodrošinās vieglu pārvaldību, pateicoties iespējai sazināties ar lietotājiem, izmantojot dabisko valodu. Šīm sistēmām vajadzēja būt pašmācībai, izmantot atmiņā uzkrātās zināšanas dažādu problēmu risināšanai, sniegt lietotājiem ekspertu padomus, un lietotājam nebija jābūt datorzinātņu speciālistam. Tika pieņemts, ka piektās paaudzes datoru cilvēks varēs lietot tikpat viegli kā jebkuru sadzīves elektroierīci, piemēram, televizoru, magnetofonu un putekļu sūcēju. Drīz pēc Japānas sākās Amerikas un Eiropas projekti.

Šādu sistēmu rašanās varētu mainīt tehnoloģiju, izmantojot zināšanu bāzes un ekspertu sistēmas. Kvalitatīvas pārejas uz piekto paaudzi datoru galvenā būtība bija pāreja no datu apstrādes uz zināšanu apstrādi. Japāņi cerēja, ka spēs cilvēka domāšanu nevis pielāgot datora darbības principiem, bet gan tuvināt datora darbību cilvēka domāšanas veidam, vienlaikus attālinoties no fon Neimaņa datoru arhitektūras. 1991. gadā tika plānots izveidot pirmo piektās paaudzes datoru prototipu.

Šobrīd ir skaidrs, ka izvirzītie mērķi nekad netika pilnībā sasniegti, taču šis projekts kalpoja par stimulu jaunas pētījumu kārtas attīstībai mākslīgā intelekta jomā un izraisīja intereses sprādzienu par loģisko programmēšanu. Tā kā tradicionālā fon Neimaņa arhitektūra nebija piemērota efektīvai ieviešanai, tika izveidoti specializēti loģiskās programmēšanas datori PSI un PIM.

Kā galvenā programmatūras izstrādes metodika piektās paaudzes datoru projektam tika izvēlēta: loģiskā programmēšana, kuras ievērojams pārstāvis ir Prolog valoda. Šķiet, ka šobrīd Prolog joprojām ir populārākā mākslīgā intelekta valoda Japānā un Eiropā (ASV tradicionāli plašāk izplatīta ir cita mākslīgā intelekta valoda - funkcionālā programmēšanas valoda Lisp).

Valodas nosaukums "Prolog" cēlies no vārdiem LOĢISKĀ PROGRAMMĒŠANA(PROgrammation en LOGique franču valodā un PROgramming in LOGic angļu valodā).

Prolog pamatā ir tāda matemātiskās loģikas nozare kā predikātu aprēķins. Precīzāk, tās pamatā ir teorēmu pierādīšanas procedūra izšķirtspējas metode Priekš Raga klauzulas. Nākamā lekcija būs veltīta šai tēmai.

Prolog valodas rašanās un attīstības vēsturē var izdalīt šādus posmus.

1965. gadā žurnāla Journal of the ACM 12. numurā publicētajā darbā "A machine oriented logic based on the resolution Principle" Dž.Robinsons iepazīstināja ar metodi teorēmu automātiskai pierādījumu atrašanai pirmās kārtas predikātu aprēķinos, t.s. " izšķirtspējas princips". Šo darbu var izlasīt tulkojumā: Robinson J. Machine-oriented logic based on rezolūcijas principu// Kibernētiskā kolekcija. - Vol. 7 (1970). Patiesībā ideju par šo metodi ierosināja Herbrands 1931. gadā, kad vēl nebija datoru (Herbrand, "Une methode de demonstration", These, Paris, 1931). Robinsons pārveidoja šo metodi tā, lai tā kļuva piemērota automātiskai, datora lietošanai, un turklāt izstrādāja efektīvu apvienošanas algoritmu, kas veido viņa metodes pamatu.

1973. gadā "mākslīgā intelekta grupa", kuru vadīja Alēns Kolmero, Marseļas Universitātē izveidoja programmu, kas paredzēta teorēmu pierādīšanai. Šī programma ir izmantota, lai izveidotu dabiskās valodas teksta apstrādes sistēmas. Teorēmu pierādīšanas programmu sauca Prolog (no Programmation en Logique). Tas kalpoja kā Prologue prototips. Leģenda vēsta, ka šī vārda autore bijusi Alana Kolmero sieva. Programma tika uzrakstīta Fortran valodā un darbojās diezgan lēni.

Liela nozīme loģiskās programmēšanas attīstībā bija Roberta Kovaļska darbam. Predikātu loģikaprogrammēšanas valoda"(Kowalski R. Predicate Logic as Programming Language. IFIP Congress, 1974), kurā viņš parādīja, ka, lai sasniegtu efektivitāti, ir jāierobežo sevi ar kopas izmantošanu Raga klauzulas. Starp citu, zināms, ka Kovaļskis un Kolmero strādāja kopā vienas vasaras laikā.

1976. gadā Kovaļskis kopā ar savu kolēģi Mārtenu van Emdenu ierosināja divas pieejas loģikas programmu tekstu lasīšanai: procesuālo un deklaratīvo. Šīs pieejas tiks apspriestas trešajā lekcijā.

1977. gadā Edinburgā Vorens un Pereira izveidoja ļoti efektīvu Prolog kompilatoru DEC-10 datoram, kas kalpoja par prototipu daudzām turpmākajām Prolog ieviešanām. Interesanti,

Lekcija ir veltīta problēmu risināšanai, izmantojot stāvokļa telpas grafiku. Stāvokļa telpa ir aprakstīta stāvokļu kopas formā - grafa virsotnes, pāreju kopa no stāvokļa uz stāvokli - grafa loki, sākuma stāvokļu kopa un gala stāvokļu kopa. Problēmas risinājums ir attēlots kā ceļš stāvokļa telpas grafikā, kas savieno sākotnējo stāvokli ar gala stāvokli. Ja problēmas stāvokļa telpa ir maza, tad visi optimālie risinājumi tiks atrasti, izmantojot dziļuma meklēšanu. Problēmās ar lielu stāvokļu telpu, izmantojot plašu meklēšanu, tiks aprēķināts tikai viens optimālais risinājums. Universālie risinātāji tiek piemēroti problēmām. Dažādu uzdevumu valstis var piederēt dažādām jomām. Lai atcerētos labākos atrastos risinājumus, tiek izmantots “mainīgais mainīgais” varM. Kompilators pats atrod nepieciešamos veidus. Visual Prolog versija 7.5, vēl nav publicēta. Tās izdošana plānota 2014. gadā, taču precīzs datums vēl nav zināms. Visual Prolog 7.4 tagad ir pieejams ikvienam.

Prologa parādīšanās bija saistīta ar loģikas, matemātikas un programmēšanas attīstību. Pēdējais spēlēja visnozīmīgāko lomu. Loģikas un matemātikas speciālisti mēģināja programmēšanu virzīt uz “pareizā ceļa”, taču informācijas tehnoloģiju attīstība uzrādīja pavisam citu rezultātu.

Daudzsološāka izrādījās pragmatiskā imperatīvā programmēšana. “Prolog” guva panākumus kā programmēšanas valoda, taču nekļuva par mākslīgā intelekta pamatu.

Klasiskā programmēšana pret loģiku

Cilvēks smagus lēmumus pieņem loģiski un pamatoti. Gandrīz nedomājot, cilvēks rīkojas gudri. Ja neņemam vērā lēmumus, kas prasa informācijas vākšanu, analīzi un sarežģītus aprēķinus, tad jebkurš rezultāts ir ātrs, precīzs un saprātīgs.

Šis fakts vienmēr ir devis iluzoru iemeslu uzskatīt lēmumu pieņemšanas instrumenta izveidi par vienkāršu lietu. Līdz ar Prologue parādīšanos šķita, ka mākslīgā intelekta jautājums ir tehnoloģiju jautājums, un Homo sapiens nāca klajā ar trim robotikas likumiem. Tomēr mākslīgais intelekts palika spoks, un trīs robotikas likumi izrādījās no pasakas - "dari to, es nezinu ko."

Programmēšana šī vārda klasiskajā izpratnē (bieži tiek lietoti termini “procedūras”, “imperatīvs” vai “funkcionāls”) ir attīstījusies un veiksmīgi pārvarējusi 80.-90.gadu “satrauktos laikus”, kad bija neskaitāmas programmēšanas valodas.

Demonstrācijas cīņa starp “Pascal” un “Si” ilga ilgu laiku un bija brutāla, taču beidzās neitrāli un klusi. Paliek ideja par labu programmēšanas valodu un vairākas veiksmīgas tās ieviešanas.

Tas nenozīmē, ka Prolog kā programmēšanas valoda nav attīstījusies. Taču izvirzītos mērķus viņš nesasniedza. Šodien mēs varam ne tikai teikt, bet arī pamatot: “Prologs” ir akadēmiska valoda:

  • Mācību mērķi;
  • predikātu loģika;
  • matemātika;
  • šaurs pielietojums.

Ir apšaubāmi, vai šo apgalvojumu var atspēkot. Mākslīgais intelekts ir ne tikai plaši izmantots, bet arī ļoti nopietns notikums, kas radikāli maina sociālo struktūru un pasaules ainu.

Programmēšana Prolog valodā mākslīgajam intelektam nenotika: vairāk nekā četrdesmit gadu valodas vēsturē nav bijis neviena radikāli jauna, sabiedrības apziņai aktuāla notikuma, kas liecinātu par pretējo.

Objektīvā realitāte ir šāda: izdzīvo ne tik daudz stiprākais, bet gan tas, kas ir pieprasīts un aktuāls.

"Prolog" ir deklaratīva programmēšanas valoda

Ir labi, ja ir instruments, lai aprakstītu faktus un noteikumus, bet kāda jēga? Fakti un noteikumi lieliski iekļaujas parastajā datubāzē. Kvalificēts klasiskais programmētājs nodrošina lietotājam interaktīvu dialogu, un pēdējais atrisina viņa problēmas.

Ja nepieciešams, programmētājs precizē dialogu, un lietotājs papildina faktu un noteikumu datubāzi. Absolūti strādājošs un gadu desmitiem pārbaudīts variants jau atrisinātu un atrisināmu problēmu masas ieviešanai.

Faktu un noteikumu deklaratīvs izklāsts jebkurā Prolog programmēšanas valodas realizācijā ir vienošanās, mēģinājums formalizēt realitāti tās intelektuālajā stāvoklī. Tradicionālā programmēšana neskar intelektu. Klasiskā programmēšana ir apmierināta ar pozīciju: datu aprakstu un apstrādi. Šeit ir daudz problēmu, taču ir daudz izcilu risinājumu, kas darbojas.

"Prolog" kā programmēšanas valoda ir fakti:

  • māte (Marija, Nataša); - Marija - Natašas māte;
  • tētis (Jevgeņijs, Marina); - Jevgeņijs ir Marinas tētis.

Šeit uzreiz ir pārspīlēts fakts: “Maria” un “Marina” ir dažādi nosaukumi. Nekas neliedz jums pievienot faktu:

  • tētis (Jevgeņijs, Marija); - Jevgeņijs ir Marijas tētis.

Šie apraksti atdzīvina noteikumus:

  • vecāks(x,y)<- папа (x, y);
  • vecāks(x,y)<- мама (x, y);

Bet viņi neļauj mums secināt, ka tētis ir Marinas tēvs, bet Marina ir Marijas māte. Šo problēmu var atrisināt; varat pievienot vēl vienu noteikumu, pievienot vēl vienu faktu. Bet cik no šīm darbībām vajadzētu veikt reālā situācijā?

Faktiski “Prolog” kā programmēšanas valoda ir faktu un noteikumu deklarācijas piemērs, bet ne loģika, pie kuras ir pieradusi klasiskā programmētāja apziņa. "Prolog" pozicionē sevi kā predikātu loģikas valodu, taču programmēšanu tajā var apgūt tikai ar piemēriem un aprakstu paraugiem no konkrētas valodas ieviešanas izstrādātājiem.

Prologu ģimene

Francija tiek uzskatīta par Prologa dzimteni, un 1973. gads ir dzimšanas gads. Interese par valodu periodiski atjaunojās, taču ar apskaužamu stabilitāti norima. Valodas moto: “Predikātu loģika ir elementāra! Tas ir veids, kā izskaidrot, kā darbojas domāšana” - un palika devīze.

Jebkura Prolog programmēšanas valodas ieviešana stingri ievēroja predikātu loģiku, bet vienmēr ietvēra klasiskās procesuālās programmēšanas idejas. Pareizāk ir teikt "obligāti", jo šis termins tiek lietots ar lielāku formalitāti nekā procesuāls, funkcionāls, objektorientēts vai cits.

Jebkura programmēšana ir saistīta ar datiem un to apstrādi. Valodas konstrukcijām pēc iespējas precīzāk jāapraksta risināmā problēma, tāpēc visas zināmās Prolog implementācijas: Turbo Prolog, Win Prolog, SWI Prolog, GNU Prolog, Visual Prolog un citas papildus deklaratīvajām konstrukcijām satur arī parastās imperatīvās izteiksmes.

Tiek uzskatīts, ka Prologue saime ir izstrādāta akadēmiskās un pētniecības organizācijās, un tāpēc par to var runāt kā par kopīgu valodu tikai konceptuālā nozīmē. Tomēr var uzskatīt pašu faktu, ka “Prolog” jēdziens ir dzīvs un attīstās: šai valodai ir vēriens, un tā ir pieprasīta noteiktā uzdevumu lokā.

Mākslīgā intelekta pamats

Interese par mākslīgo intelektu nekad nav mazinājusies, viņi tikai sāk runāt par to, kad rodas kārtējā gadījuma, bet Prolog nekad nav bijis saistīts ar mākslīgo intelektu vairāk kā parastu klasisko programmēšanas valodu.

80. gadu beigās bija īsts, aktuāls un populārs intelektuāls projekts “Izgudrošanas mašīna”. Bija reāls mēģinājums izmantot Prolog, lai formalizētu milzīgu praktisko zināšanu bāzi (datus) par izgudrojumiem, fizikāliem, ķīmiskiem un citiem likumiem.

Rezultāts netika sasniegts, Prolog kā programmēšanas valodā bija jāieraksta pārāk daudz faktu un noteikumu, kuriem bija banāls imperatīvs raksturs. Tikmēr daudzi veiksmīgi programmatūras produkti tika ieviesti paralēli parastajās valodās.

90. gadu sākumā veiksmīgi tika realizēts reālas intelektuālās sistēmas projekts, kas simulēja bērna līdz 3 gadu vecumam uzvedību ES datorā! Prolog izmantošanas iespēja pat netika apsvērta.

Šī intelektuālā sistēma ne tikai “izdomāja”, kas ir mamma un tētis un ar ko Marija atšķiras no Marinas, bet arī bez lielas piepūles patstāvīgi pārlēca no iegūtajām zināšanām par šiem jautājumiem līdz bumbiņām un to atšķirībām no kubiņiem, līdz kubiņu krāsām. objektiem un... (!) elementārajai matemātikai: vienkāršas aritmētiskas darbības izrādījās viņas iespēju robežās, balstoties uz zināšanām, kas iegūtas, risinot pavisam citas problēmas.

Nevarētu teikt, ka klasiskā programmēšana mākslīgā intelekta teritorijas apguvē apsteidz Prolog, taču tā dod reālus rezultātus.

Runājot par izlūkošanu kā uzdevumu, acīmredzot jautājums šeit ir nevis valodā, bet gan īstenošanas idejā. Ja 1991. gada montētājs varēja “kļūt par pamatu” inteliģentai situācijas inteliģences sistēmai, tad problēma nepārprotami slēpjas nevis ieviešanas valodā, bet gan idejā.

Prolog programmēšanas valoda ir viena no vadošajām loģiskās programmēšanas valodām. To pagājušā gadsimta 70. gados izveidoja Alēns Kolmerauers. Tas bija mēģinājums izveidot programmēšanas valodu iesācējiem, kas ļauj izteikt loģiku, nevis rūpīgi norādīt, ko vēlaties sasniegt ar norādījumiem datora ekrānā.

Prolog tiek izmantots daudzās mākslīgā intelekta programmās, taču tā sintakse un semantika ir ļoti vienkārša un skaidra (sākotnējais mērķis bija nodrošināt rīku datoru analfabētiem valodniekiem). Nosaukums Prolog ir LOGIC PROGRAMMING akronīms un ir plaši pazīstams programmēšanas pamatu mācīšanā.

Prolog pamatā ir predikātu aprēķins (precīzāk, pirmās kārtas predikātu aprēķins), bet tas ir ierobežots ar Horna formulām. Prolog programmas ir efektīvas, lai pierādītu teorēmas ar pirmo tuvinājumu. Savienojuma, astes rekursijas un izsekošanas pamatjēdzieni.

Datu veidi

Prolog neizmanto datu tipus tā, kā mēs esam pieraduši ierastajās programmēšanas valodās. Mēs varam runāt par Prolog leksikas elementiem, nevis datu tipiem, kas ir neparasti programmējot manekenus.

Pastāvīgais teksts tiek ievadīts, izmantojot atomus. Atoms ir burtu, ciparu un pasvītras secība, kas sākas ar mazo burtu. Parasti, ja tie nav burtu un ciparu atomi, tad tie ir jāierāmē ar apostrofiem (piemēram, "+" ir atoms, + ir operators).

Lielākā daļa Prolog implementāciju nenošķir reālos un daļskaitļus.

Mainīgie lielumi

Mainīgos identificē ar burtu, ciparu un pasvītru virkni, sākot ar lielo burtu. Prolog vidē mainīgais nav konteiners, ko var piešķirt (atšķirībā no procesuālajām programmēšanas valodām). Tās uzvedība ir tuvāka modelim, kas ir līdzīgs savienošanai.

Tā sauktie anonīmie mainīgie tiek rakstīti kā viens pasvītrojums (_).

Termini ir vienīgais veids, kā Prolog var attēlot sarežģītus datus. Termins sastāv no galvas, ko sauc arī par funktoru (kam jābūt atomam) un parametriem (ne tikai tipiem). Svarīgs ir parametru skaits, tā sauktās termina aritātes. Termins tiek definēts pēc tā galvas un aritātes, kas parasti tiek rakstīts kā functor/arity.
Saraksti

Saraksts nav atsevišķs datu tips, jo to nosaka rekursīva konstrukcija (izmantojot terminu /2 "."):

Atom — tukšs saraksts

Programmētāja ērtībām sarakstus var veidot un iznīcināt dažādos veidos.

Ja L ir saraksts un X ir elements, tad "." (X, L) ir saraksta dalībnieks. Pirmais elements X, kam seko konteksta L saturs, tiek sintaktiski attēlots kā.

Programmētāja ērtībām sarakstus var veidot un iznīcināt dažādos veidos.

Preču saraksts:
Viena elementa priekšvārds:
Sākotnēji vairāki elementi:
Termina paplašinājums: "."(abc, "."(1, "."(f(x), ".").(Y, ".").(g(A,rst), )))))

Virknes parasti tiek rakstītas kā rakstzīmju secība pēdiņās. Tie bieži tiek attēloti kā ASCII rakstzīmju kodu saraksti.

Programmēšana programmā PROLOG ļoti atšķiras no darba ar procesuālajām valodām. Programmā Prolog jūs strādājat ar faktu un noteikumu datu bāzēm, varat palaist datu bāzes vaicājumus. Prolog pamatvienība ir predikāts, kas ir definēts kā patiess. Predikāts sastāv no galvas un vairākiem argumentiem. Piemēram:

Šeit "kaķis" ir galva un "toms" ir arguments. Šeit ir daži vaicājumu piemēri, kurus varat izpildīt, izmantojot Prolog tulkotāju, pamatojoties uz šo faktu:

Kaķis (toms).
Jā.

Kaķis (X).
X = tom;
Nē.

Predikāti parasti tiek definēti, lai izteiktu faktu, ar kuru programma zina par pasauli. Vairumā gadījumu predikātu lietošanai ir vajadzīgas noteiktas konvencijas. Tātad, kurš no šiem vārdiem nozīmētu, ka Pets ir Sallijas tēvs?

Tēvs (sally, pat).
tēvs (pat, Sally).

"tēvs" abos gadījumos ir galva, un "sally" un "pat" ir argumenti. Tomēr pirmajā gadījumā Sallija ir pirmajā vietā argumentu sarakstā, bet Pats ir otrajā vietā un otrādi. Pirmais gadījums ir definīcijas piemērs secībā Verb Subject un Object, bet otrajā piemērā secība ir Verb Object Subject. Tā kā Prolog nesaprot angļu valodu, abas versijas ir labas, taču tiek uzskatīts par labu programmēšanas stilu, rakstot vienu programmu, pieturēties pie viena stila, ko sauc par konvenciju, nevis rakstīt kaut ko līdzīgu:

Tēvs (pat, Sally). tēvs (Džesika, Džeimss).

Atsevišķi predikāti ir iebūvēti valodā un ļauj Prolog samazināt ikdienas darbību (piemēram, ievade/izvade, izmantojot grafiku un citu saziņu ar operētājsistēmu) slogu. Piemēram, rakstīšanas predikātus var izmantot šādai parādīšanai:

Rakstiet ("sveiki")

Ekrānā tiks parādīts vārds "Sveiki".

Noteikumi

Otrs paziņojuma veids programmā Prolog ir noteikumi. Noteikuma piemērs:

Apgaismojums (ieslēgts): - slēdzis (ieslēgts).

":-" nozīmē "ja", šis noteikums nozīmē, ka gaisma (ieslēgta) ir patiesa (ieslēgta), ja slēdzis (ieslēgts) ir patiess (citādi, ja slēdzis ir ieslēgts, tad ir gaisma). Noteikumos var izmantot arī mainīgos; mainīgie sākas ar lielo burtu, bet konstantes sākas ar mazajiem burtiem. Piemēram,

Tēvs (X,Y) :- vecāks (X,Y), vīrietis (Y).

Tas nozīmē: "ja kāds ir vecāks un viņš ir vīrietis, tad viņš ir tēvs." Cēloņi un sekas var būt arī apgrieztā secībā, tāpēc tas nav pretrunā ar parasto loģiku. Seku sadaļā varat ievietot vairākus predikātus, apvienojot tos kopā, piemēram:

Kas ir līdzvērtīgs vairākām deklarācijām:

A:- d. b:- d. c:- d.

Bet instrukcijas, piemēram:

Kas ir ekvivalents "ja c, tad a vai b". Tas ir saistīts ar Horna formulas noteikto ierobežojumu.