de Rachel Wiles

Cum să înveți Prolog vizionând Game of Thrones

Sunt morți? Sunt în viață? E mătușa lui? În loc să vă gândiți la 2011, salvați epuizarea și construiți-vă propriul expert folosind Prolog.

Cum sa inveti Prolog vizionand Game of Thrones
Imagine prin HBO

Jocul Tronurilor obligatoriu AVERTISMENT SPOILER! Evenimentele incluse sunt până la sezonul 7, ignorând orice se întâmplă numai în cărți. Dacă nu sunteți la curent, continuați cu prudență. Dar, Prologul rămâne același din 1972, fără răsuciri de complot și o structură ușor de urmat, pe care acest tutorial vă va ajuta să as.

Stabiliți faptele

Prolog este un limbaj de programare logică, care formează reguli și relații din fapte. Pentru a utiliza Prolog, interogările sunt transmise printr-o bază de date structurată de fapte. Game of Thrones este renumit pentru arborii genealogici complexi (și adesea incestuoși), așa că împărțirea lucrurilor în fapte simple începe o bază excelentă pentru o bază de date Prolog.

Cum sa inveti Prolog vizionand Game of Thrones
Nu are nimeni timp pentru asta. Imagine prin diagrame utile

Simplificați lucrurile pornind baza de date cu un set de fapte, care poate fi aplicat tuturor personajelor. Pentru arborii genealogici, un loc bun pentru a începe este conectarea personajelor prin părinții lor. Luați cazul Arya Stark:

parent(eddard_stark, arya_stark).parent(catelyn_stark, arya_stark).

Aici, au fost definite două fapte separate, spunând că Eddard și Catelyn sunt părinții lui Arya. Apoi, puteți extrapola aceste interogări în întregul univers Game of Thrones, pentru toate casele, pentru a crea o bază de date completă (sau, poachează întregul set de date din GitHub). Numai aceste fapte sunt suficiente pentru a începe să faceți interogări. Cea mai de bază interogare verifică dacă un fapt este prezent în baza de date.

?-parent(eddard_stark, arya_stark).true

Dacă introduceți relații care nu se află în baza de date, aceasta revine fals. De asemenea, puteți interoga cu variabile în Prolog utilizând majuscule. Pentru a afla cine sunt părinții lui Arya, întrebați:

?-parent(Parent, arya_stark).Parent = eddard_stark ;Parent = catelyn_stark.

Eddard revine primul în acest exemplu, pentru că acesta este primul Adevărat fapt listat în baza de date. Punctul și virgula efectuează căutări pentru alte răspunsuri adevărate (catelyn_stark), până când nu rămân niciunul. O perioadă pune capăt căutării împreună. Utilizați sublinierile ca variabile anonime pentru a filtra informațiile care nu contează. De exemplu, dacă ai vrut să vezi că Arya are părinți, dar nu-ți pasă cine sunt, interogă următoarele:

?-parent(_, arya_stark).true
1611327488 856 Cum sa inveti Prolog vizionand Game of Thrones
Sezonul 1 Episodul 1: Ultima dată când cineva a zâmbit în GoT. Imagine prin Fanpop

Creați reguli

Acum că există date în baza de date, începeți să creați reguli. Regulile sunt dependente de fapte. Legarea faptelor împreună creează reguli. Din ultimul nostru exemplu, faceți o regulă simplă din faptul părintelui, pentru a determina o relație de copil; X este copilul lui Y dacă (scris ca : – în Prolog) Y este părintele lui X.

child(X, Y) :-    parent(Y, X).

Aceasta inversează în esență regula părinte și permite căutările în sus și în jos în arborele genealogic. Într-un alt caz, să presupunem că doriți să faceți o regulă determinată de absenta de fapt …

status(X, dead) :-    not(status(X, alive)).

Aici, am extins baza de date pentru a include un set de reguli pentru fiecare personaj care este încă în viață. Interogarea caută în baza de date pentru toate cazurile în care persoana X este în viață. nu indică faptul că, dacă nu se constată că X este viu, atunci X este mort. Această regulă este eficientă pentru Game of Thrones, deoarece necesită doar o mână de fapte, pentru câțiva care sunt încă în viață.

1611327488 574 Cum sa inveti Prolog vizionand Game of Thrones
dies (X): – jucat_by (X, sean_bean). Imagine prin nova969

Reguli mai interesante și specifice sunt create prin combinarea faptelor. De exemplu, pentru a crea o relație mamă / tată, este nevoie de mai multe informații despre sexul fiecărui personaj din Game of Thrones. Odată terminată, o regulă pentru identificarea mamelor este creată de următoarele:

mother(X, Y) :-    parent(X, Y),    female(X).

În cele de mai sus, am afirmat că o mamă (X) este părintele cuiva și (scris ca virgulă în Prolog) este feminin.

Până acum am acoperit călătoriile în sus și în jos în arborele genealogic, dar nu am atins de la stânga la dreapta. Prin crearea unei reguli pentru frați, interogările pot fi făcute în toate direcțiile din arborele genealogic Game of Thrones:

sibling(X, Y) :-    parent(Z, X),    parent(Z, Y),    dif(X, Y).

În termeni laici, aceasta afirmă că două persoane (X și Y) sunt frați dacă ambii au același părinte (Z). dif funcția aici este importantă pentru a opri revenirea programului înșiși ca propriul lor frate. Oricum, există limitări ale acestei abordări. Interogarea acestui lucru îi va evalua pe ambii părinți ai lui X și ambii părinți ai lui Y (adesea, dar nu întotdeauna, aceiași oameni), prin urmare căutarea completă va returna duplicate. Acest lucru poate fi remediat prin introducerea listelor.

1611327489 75 Cum sa inveti Prolog vizionand Game of Thrones
O rasă complet diferită de probleme de frate. Imagine prin wordpress

Realizarea listelor

Revizuirea problemei fraților, adăugarea listelor va realiza o implementare mai bună și va avea multe aplicații în Prolog. Codul utilizat anterior poate fi încă utilizat, însă rezultatele trebuie colectate într-o listă folosind următoarele:

list_siblings(X, Siblings) :-    setof(Y, sibling(X, Y), Siblings);    Siblings = none. 

set de reunește toate rezultatele posibile pentru sibling(X, Y)interogare și le stochează într-o listă numită Siblings. În cazul în care nu există frați, sau componentă (reprezentată printr-un punct și virgulă în Prolog) nu returnează niciuna. set de elimină, de asemenea, orice duplicat, păstrând numai valori unice, prin urmare îmbunătățește interogarea anterioară. Acum că o listă de frați poate fi generată pentru orice caracter, o interogare separată poate determina dacă 2 caractere sunt frați:

siblings(X, Y) :-    list_siblings(X, Siblings),    member(Y, Siblings).

Când este interogat, acest lucru creează lista Siblings pentru X și le folosește membru pentru a determina dacă Y se află în lista Fraților.

Acum că există baze de date, relații de părinți și sex, nu este nevoie să vizitați Marea Bibliotecă din Cetate pentru a afla cine este mătușa lui Jon Snow.

1611327489 436 Cum sa inveti Prolog vizionand Game of Thrones
Ar fi trebuit să folosesc Prolog. Imagine prin ziua de azi

Recursivitate

Arborii genealogici din Game of Thrones se întind mult mai departe decât doar familia imediată. Este posibil să vă aventurați mai departe și să generați legături între relații mai îndepărtate. Folosind predicatul părinte, Prolog poate evalua recursiv baza de date pentru a găsi strămoși. Configurați recursivitatea prin includerea următoarelor 3 secțiuni într-o bază de date:

  1. Secțiunea de terminare – Această secțiune trebuie să apară înainte de secțiunea de buclă, pentru a opri programul să se bucle la infinit:
ancestor(X, Y) :-    parent(X, Y).

2. Secțiunea Looping – Această secțiune se apelează în mod repetat, până când se îndeplinește condiția de terminare de mai sus:

ancestor(X, Y) :-    parent(X, Z),    ancestor(Z, Y).

3. Secțiunea de apelare – interogare? -Ancestors (X, Ancestor_of) pentru a începe stocarea unei liste de strămoși prin fiecare recursivitate, așa cum este definit mai sus:

ancestors(X, Ancestor_of) :-    findall(A, ancestor(X, A), Ancestors_of).

Găsiți toate funcția de aici funcționează similar cu set de, cu toate acestea, nu exclude duplicatele și returnează o listă a cui este strămoșul lui X.

Tipărire și formatare

Dacă sunteți în căutarea unui ghișeu unic în care să puteți obține toate informațiile despre un singur personaj, veți avea nevoie de formatare pentru a le organiza. Pentru a returna o grămadă de informații dintr-o singură dată, apelați la regulile definite anterior într-o regulă:

tell_me_about(X) :-    alive_or_dead(X),    parents(X, Parents),    format("Parents: ~w", [Parents]), nl,     children(X, Children),    format("Children: ~w", [Children]), nl,    list_siblings(X, Siblings),    format("Siblings: ~w", [Siblings]), nl,    !.

format returnează orice ieșire din paranteză pătrată în locul lui ~ w și imprimă tot cuprins în ghilimele. nl reprezintă o nouă linie. Funcția de tăiere (!) în Prolog previne retragerea înapoi, deci forțează programul să nu mai găsească soluții suplimentare după ce a fost găsită prima. În cele de mai sus, acest lucru asigură că totul se imprimă o dată. Interogarea cu Stannis Baratheon oferă următoarele:

1611327489 564 Cum sa inveti Prolog vizionand Game of Thrones

Functia imprimare poate fi, de asemenea, utilizat în locul formatului, atunci când nu există variabile care să fie transmise.

1611327490 741 Cum sa inveti Prolog vizionand Game of Thrones
Codul este lung și plin de erori. Imagine prin HBO

Folosind aritmetica

Operațiile aritmetice pot fi utilizate în Prolog pentru interpretarea și analiza datelor. Să presupunem că Arya vrea acum să fie super organizată și să folosească Prolog în loc să-și lase lista în memorie. Ar putea folosi următoarele pentru a ține evidența:

aryas_list :-    print("ARYAS TOP SECRET LIST. KEEP OUT."), nl,    findall(X, on_list(X), MainList),    ticked_off(List),    format("Done: ~w", [List]), nl,    not_dead_yet(AnotherList),    format("Still to go: ~w", [AnotherList]), nl,    length(AnotherList, LCompletedList),         length(MainList, LMainList),    Percent is ((LMainList - LCompletedList) / LMainList) * 100,    Percentage is round(Percent),             format("Percentage complete: ~w%", [Percentage]), nl.

În aryas_list, am folosit următorii operatori:

  • * Înmulțiți
  • – Scade
  • / Divide
  • lungime(). Generați lungimea listei
  • rundă(). Rotund la cel mai apropiat număr întreg

Rezultatul arată după cum urmează:

1611327490 916 Cum sa inveti Prolog vizionand Game of Thrones
1611327491 814 Cum sa inveti Prolog vizionand Game of Thrones
is_arya: – fată (X), no_name (X). Imagine prin invers

Cu toate instrumentele acoperite, există multe modalități mai interesante de a explora universul Game of Thrones din Prolog. Sau, deșeuri, urmărind spectacolul în întregime, după ce a aflat cine ar trebui să stea pe tronul de fier printr-o programare logică incontestabilă.

rightful_heir(X) :-    parent(robert_baratheon, X),    status(X, alive).

Rezultatele vorbesc de la sine …

1611327491 218 Cum sa inveti Prolog vizionand Game of Thrones
Mesaje primite sunt deschise pentru dezbatere.

Dacă doriți să extindeți baza de date existentă sau să vă jucați în crearea propriilor relații, codul este pe mine GitHub.

Urmează-Mi LinkedIn pentru proiecte viitoare.