Jump to content
bogdanvaduva

[Prolog] Cum aflu daca numele unei variabile e compus doar din litere?

Recommended Posts

Posted

Salut, sunt deestul de nou in ceea ce priveste Prolog-ul si am intampinat putine dificultati. Mai exact , am de facut urmatorul lucru: sa interpretez un program de genul:

 

x = 2;
y = 3;

if (x < y){

           a2 = 1;
           
}
           
return a2;

Ideea e ca am reusit sa fac assignarile (pentru x = 2, y = 3 si asa mai departe) dar nu este permis ca numele unei variabile sa fie IF, WHILE, ELSE, RETURN, THEN si de asemenea, variabila trebuie sa contina doar litere. Adica acest cod, imi va intoarce o eroare de tipul "Incorrect variable name". Are cineva idee cum pot sa verific? 

Posted

Am observat ca pui intrebari din diferite limbaje de programare, inveti toate aceste limbaje simultan ? Daca este asa sfatul meu este sa te limitezi la un singur limbaj, sa-i inveti bazele, sa continui cu acesta pana cand il stapanesti, iar dupa daca te consideri capabil poti trece la un alt limbaj.

  • Upvote 1
Posted

Salut, iti multumesc mult pt sfat. Ideea este ca am inceput sa invat si alte limbaje decat cele imperative. Haskell-ul pot spune ca am reusit sa il stapanesc, dupa aproape 3-4 luni de lucrat, iar acum incerc sa invat bazele Prolog-ului. 

Posted

Salut, era vorba doar de putin lucru cu codul ASCII al literelor/cifrelor. E ceva de genul: cifele sunt intre 48 si 57 si restul sunt litere, si practic daca gaseai un cod ascii de enul asta dupa ce foloseai atom_chars() care iti transforma de ex: "cuvant2" in [c, u, v, a, n, t, '2'], nu trebuia decat sa intorci un cod de eroare. :D (in cazul meu am intors 0) Pot atasa si codul daca vrei.

Posted
46 minutes ago, bogdanvaduva said:

Salut, era vorba doar de putin lucru cu codul ASCII al literelor/cifrelor. E ceva de genul: cifele sunt intre 48 si 57 si restul sunt litere, si practic daca gaseai un cod ascii de enul asta dupa ce foloseai atom_chars() care iti transforma de ex: "cuvant2" in [c, u, v, a, n, t, '2'], nu trebuia decat sa intorci un cod de eroare. :D (in cazul meu am intors 0) Pot atasa si codul daca vrei.

Pai de obicei, daca ai pus o problema, trebuie sa ii dai si rezolvarea. Cel putin asa e fain si etic. Gen pune-te in locul celui care peste 3 ani o sa caute aceeasi problema si o sa plece dezamagit ca ownerul s-a multumit sa o pastreze pentru el.

Posted

Ok, sigur. Imi cer scuze ca nu m-am gandit la asta dinainte. 

 

Aici este codul. 

 

err(E,V1) :- pair(E, _), E = 'if' ,V1 = 0,!.
err(E,V1) :- pair(E, _), E = 'then' ,V1 = 0,!.
err(E,V1) :- pair(E, _), E = 'else' ,V1 = 0,!.
err(E,V1) :- pair(E, _), E = 'while' ,V1 = 0,!.
err(E,V1) :- pair(E, _), E = 'return' ,V1 = 0,!.
err(E,V1) :- atom_chars(E,Res), errAux(Res, V1).

/*
*facem verificarea ca nu cumva variabila sa fie unul din cuvintele if, then, else, while, return
*iar daca nu este, atunci vom sparge variabila intr-o lista de char-uri, pe care le vom verifica cu
*functia auxiliara errAux
*/

errAux([], R) :- R is 1,!.
errAux([H|T], R) :-  char_code(H, Asc), Asc > 47, Asc < 58, R is 0,!.
errAux([H|T], R) :- char_code(H,Asc), errAux(T,R).
/*
*Ok, acum avem lista, de exemplu pentru "ana2" vom avea [a, n, a, '2'].
*Avand in vedere ca 2 este tratat ca si string (daca am inteles eu bine)
*Vom verifica codul ascii pt fiecare, iar daca se afla intre 47 si 58 atunci vom intoarce 0
*apoi verificam urmatorul element si asa mai departe
*/                                                           
err([H|T],V1) :- V1 = 1,!.
//daca nu a fost gasita o cifra, vom intoarce 1

In prima parte am verificat daca este cumva unul din cuvintele care nu trebuie, iar in Aux am verificat chestia cu codul ASCII. Practic, primind o lista, exact cum am spus mai sus, am verificat fiecare element sa fie litera, iar daca nu este (linia 2 din errAux), atunci vom intoarcea valoarea 0 (incorect). Altfel, vom parcurge pana la finalul listei si daca nu vom gasi, vom intoarce 1 (corect), adica ultima linie. Nu stiu cat de explicit am fost, dar sper sa ajute. 

  • Upvote 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...