[Prolog] Kalkulator

0

Cześć,
Mam problem, na laborkach dostałem zadanie zrobienie kalkulatora w prologu dla liczb rzeczywistych z nawiasami.
Czyli np "44+((3+33)(3(3+3)))"

Generalnie nie mam pomysłu w jaki sposób zrobić określenie liczby całkowitej dowolnie dużej(bo rozwiązanie zaprezentowane poniżej raczej się nie sprawdzi), a dalej liczby rzeczywistej.

Poniżej kod jaki mam dotychczas:

%Cyfry
cyfra(X) --> "1", {X is 1}.
cyfra(X) --> "2", {X is 2}.
cyfra(X) --> "3", {X is 3}.
cyfra(X) --> "4", {X is 4}.
cyfra(X) --> "5", {X is 5}.
cyfra(X) --> "6", {X is 6}.
cyfra(X) --> "7", {X is 7}.
cyfra(X) --> "8", {X is 8}.
cyfra(X) --> "9", {X is 9}.
cyfra(X) --> "0", {X is 0}.


%Liczby Ca�kowite
liczba_c(X) --> cyfra(X).
liczba_c(X) --> cyfra(A), cyfra(B), {X is((A*10)+B)}.
liczba_c(X) --> "-",liczba_c(A),{X is -A}.

%Operatory
plus(X)  --> "+".
minus(X) --> "-".
razy(X)  --> "*".
przez(X) --> "/".

%Dzilania
iloczyn(Wynik) --> liczba_c(Wynik).
iloczyn(Wynik) --> liczba_c(A), razy(D), liczba_c(B), {Wynik is A*B}.
%iloczyn(Wynik) --> iloczyn(A), razy(D), liczba_c(B), {Wynik is A*B}.
iloczyn(Wynik) --> liczba_c(A), razy(D), iloczyn(B), {Wynik is A*B}.

suma(Wynik)    --> liczba_c(Wynik).
suma(Wynik)    --> liczba_c(A), plus(D), liczba_c(B), {Wynik is A+B}.
suma(Wynik) 	--> liczba_c(A), plus(D), suma(B), {Wynik is A+B}.
suma(Wynik)		--> iloczyn(A), plus(D), iloczyn(B), {Wynik is A+B}.
suma(Wynik)		--> iloczyn(A), plus(D), suma(B), {Wynik is A+B}.


roznica(Wynik) --> liczba_c(Wynik).
roznica(Wynik) --> liczba_c(A), minus(D), liczba_c(B), {Wynik is A-B}.

iloraz(Wynik)  --> liczba_c(Wynik).
iloraz(Wynik)  --> liczba_c(A), przez(D), liczba_c(B), {Wynik is A/B}.

oblicz(Wynik) --> suma(Wynik).
oblicz(Wynik) --> roznica(Wynik).
oblicz(Wynik) --> iloczyn(Wynik).
oblicz(Wynik) --> iloraz(Wynik).
%oblicz(Wynik) --> suma(X), plus(D), iloczyn(Y), {Wynik is X+Y}.

Proszę o jakieś porady :)

0

ale jak okreslenie liczby?

tutaj generalnie piszesz gramatykę i zamieniasz ja na parser. Jedyne co masz zrobić to napisać gramatykę z dobrą kolejnością (priorytetem) działań i zamienić ją na parser (co w prologu jest proste). Wszystko. Resztę załatwi prolog.

cyfra(X) --> "1", {X is 1}.
cyfra(X) --> "2", {X is 2}.
cyfra(X) --> "3", {X is 3}.
cyfra(X) --> "4", {X is 4}.
cyfra(X) --> "5", {X is 5}.
cyfra(X) --> "6", {X is 6}.
cyfra(X) --> "7", {X is 7}.
cyfra(X) --> "8", {X is 8}.
cyfra(X) --> "9", {X is 9}.
cyfra(X) --> "0", {X is 0}.

nat(X,1)-->cyfra(X).
nat(X,N)->cyfra(Y),nat(Z,N1),{N is N1*10,Y1 is Y*N, X is Y1+Z}.

liczba_c(X) --> "-",nat(Y),{X is (-1)*Y}.

ulamek(X,N)-->cyfra(Y),{X is Y*N}.
ulamek(X,N)-->cyfra(Y),{N1 is N/10},ulamek(Z,N1),{X is Y*N + Z}.

liczba_r (X) --> liczba_c(C),".",ulamek(U,_),{X is C + U}.
liczba_r (X) --> liczba_c(C).

op1 (X) --> op2(X1),"+",op2(X2),{X is X1+X2}.
op1 (X) --> op2(X1),"-",op2(X2),{X is X1-X2}.

op2 (X) --> op3(X1),"*",op3(X2),{X is X1*X2}.
op2 (X) --> op3(X1),"/",op3(X2),{X is X1/X2}.

op3(X) --> "(",op1(X),")".
op3(X)--> liczba_r(X).

Juz prawie rok w tym nie pisalem, wiec nie jestem pewien, ale chyba jakos tak to było.

0
liczba_c(X) --> "-",nat(Y,_),{X is (-1)*Y}.

ulamek(X,N)-->cyfra(Y),{X is Y*N}.
ulamek(X,N)-->cyfra(Y),{N1 is N/10},ulamek(Z,N1),{X is Y*N + Z}.

liczba_r (X) --> liczba_c(C),".",{S is 1 / 10},ulamek(U,S),{X is C + U}.
liczba_r (X) --> liczba_c(C).

blad byl. teraz chyba dobrze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1