% Written by Marco Manna is_digit(0). is_digit(1). is_digit(2). is_digit(3). is_digit(4). is_digit(5). is_digit(6). is_digit(7). is_digit(8). is_digit(9). digit(X, Y, C) :- char(C, Y), is_digit(C), X = Y - 1. dig(X) :- digit(Fv1, X, Fv2). %%%%%%%%%%% -> | sign(X, p) :- char(p, X). sign(X, m) :- char(m, X). greater(X) :- char(g, X). multiply(p, p, p). multiply(p, m, m). multiply(m, p, m). multiply(m, m, p). opposite(m, p). opposite(p, m). %%%%%%%%%%% -> + %%%%%%%%%%% -> '0' | ... | '9' % num_1(X, Y, Val) :- digit(X, Y, Val), not dig(X). num_1(X, Z, NewVal) :- num_1(X, Y, Val_1), digit(Y, Z, Val_2), NewVal_1 = 10 * Val_1, NewVal = NewVal_1 + Val_2. num(X, Y, Val) :- num_1(X, Y, Val), Z = 1 + Y, not dig(Z). par_expr(X, W, S, Val) :- char(o, Y), expr(Y, Z, S, Val), W = Z + 1, char(c, W), X = Y - 1. sign_term(X, Z, S3, Val) :- sign(Y, S1), par_expr(Y, Z, S2, Val), multiply(S1, S2, S3), X = Y - 1. sign_term(X, Z, S, Val) :- sign(Y, S), num(Y, Z, Val), X = Y - 1. expr(X, Y, p, Val) :- char(o, X), num(X, Y, Val). expr(0, Y, p, Val) :- num(0, Y, Val). expr(X, Y, S, Val) :- par_expr(X, Y, S, Val). expr(X, Y, S, Val) :- sign_term(X, Y, S, Val). expr(X, Z, S, Val) :- expr(X, Y, S, Val_1), sign_term(Y, Z, S, Val_2), Val = Val_1 + Val_2. expr_1(X, Z, S1, S2, Val_1, Val_2) :- expr(X, Y, S1, Val_1), sign_term(Y, Z, S2, Val_2), opposite(S1, S2). expr(X, Y, p, 0) :- expr_1(X, Y, Fv1, Fv2, Val, Val). expr(X, Y, S1, Val) :- expr_1(X, Y, S1, Fv1, Val_1, Val_2), Val_1 > Val_2, Val = Val_1 - Val_2. expr(X, Y, S2, Val) :- expr_1(X, Y, Fv1, S2, Val_1, Val_2), Val_1 < Val_2, Val = Val_2 - Val_1. %%%%%%%%%%% -> '>' %%%%%%%%%%% -> | epsilon % greater_sign(X, Y, p) :- greater(Y), digit(Y, Fv1, Fv2), X = Y - 1. greater_sign(X, Z, S) :- greater(Y), Z = Y + 1, sign(Z, S), X = Y - 1. %%%%%%%%%%% -> % values(S_left, Val_left, S_right, Val_right) :- expr(0, Y, S_left, Val_left), greater_sign(Y, Z, S_right), num(Z, W, Val_right). sol :- values(p, Val_left, p, Val_right), Val_left > Val_right. sol :- values(m, Val_left, m, Val_right), Val_left < Val_right. sol :- values(p, Val_left, m, Val_right). :- not sol.