Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- domains
- /**
- * Выражение может состоять из:
- * 1. Функция plus() - сложить
- * 2. Функция sub() - вычесть
- * 3. Функция mul() - умножить
- * 4. Функция dev() - разделить
- * 4. num() - число
- */
- expr = plus(expr, expr); sub(expr, expr); mul(expr, expr); dev(expr, expr); num(integer).
- predicates
- /**
- * В предикат передаем одну из функций
- */
- nondeterm evaluate(expr, integer).
- clauses
- /**
- * Вычисляем значение в текущей вершине
- * Сначала вычисляем левую вершину
- * Затем правую
- */
- evaluate(plus(Left, Rigth), Sol) :-
- evaluate(Left, LeftResult),
- evaluate(Rigth, RigthResult),
- Sol = LeftResult + RigthResult.
- evaluate(sub(Left, Rigth), Sol) :-
- evaluate(Left, LeftResult),
- evaluate(Rigth, RigthResult),
- Sol = LeftResult - RigthResult.
- evaluate(mul(Left, Rigth), Sol) :-
- evaluate(Left, LeftResult),
- evaluate(Rigth, RigthResult),
- Sol = LeftResult * RigthResult.
- evaluate(dev(Left, Rigth), Sol) :-
- evaluate(Left, LeftResult),
- evaluate(Rigth, RigthResult),
- Sol = LeftResult / RigthResult.
- evaluate(num(X), Sol) :- Sol = X.
- goal
- % evaluate(plus(num(2), num(2)), X). % 2 + 2 = 4
- % evaluate(plus(mul(num(2), num(4)), mul(num(3), num(3))), X). % (2 * 4) + (3 * 3) = 8 + 9 = 17
- evaluate(plus(mul(num(2), sub(num(3), mul(num(2), num(2)))), dev(num(2), num(2))), X). % (2 * (3 - (2 * 2))) + (2 / 2) = (2 * -1) + 1 = -2 + 1 = -1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement