bogdanvaduva Posted May 31, 2016 Report Posted May 31, 2016 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? Quote
Erase Posted May 31, 2016 Report Posted May 31, 2016 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. 1 Quote
bogdanvaduva Posted May 31, 2016 Author Report Posted May 31, 2016 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. Quote
theandruala Posted May 31, 2016 Report Posted May 31, 2016 Nu este permis ca o variabila sa aiba unul din acele nume pentru ca altfel ar fi confundate cu o sintaxa. Daca if ar fi o variabila, int if=2; if(if<4) return if; Nu ar avea sens. 1 Quote
bogdanvaduva Posted May 31, 2016 Author Report Posted May 31, 2016 Am reusit, pana la urma, sa ii dau de cap. Va multumesc mult pt raspunsuri! Quote
urs Posted May 31, 2016 Report Posted May 31, 2016 2 hours ago, bogdanvaduva said: Am reusit, pana la urma, sa ii dau de cap. Va multumesc mult pt raspunsuri! Cum se rezolva? Quote
bogdanvaduva Posted May 31, 2016 Author Report Posted May 31, 2016 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. (in cazul meu am intors 0) Pot atasa si codul daca vrei. Quote
Silviu Posted May 31, 2016 Report Posted May 31, 2016 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. (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. Quote
bogdanvaduva Posted May 31, 2016 Author Report Posted May 31, 2016 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. 1 Quote