Advertisement
Gistrec

Пролог 5 лаба

Dec 11th, 2018
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 1.58 KB | None | 0 0
  1. domains
  2.     /**
  3.      * Выражение может состоять из:
  4.      * 1. Функция plus() - сложить
  5.      * 2. Функция sub() - вычесть
  6.      * 3. Функция mul() - умножить
  7.      * 4. Функция dev() - разделить
  8.      * 4. num() - число
  9.      */
  10.     expr = plus(expr, expr); sub(expr, expr); mul(expr, expr); dev(expr, expr); num(integer).
  11.  
  12. predicates
  13.     /**
  14.      * В предикат передаем одну из функций
  15.      */
  16.     nondeterm evaluate(expr, integer).
  17. clauses
  18.     /**
  19.      * Вычисляем значение в текущей вершине
  20.      * Сначала вычисляем левую вершину
  21.      * Затем правую
  22.      */
  23.     evaluate(plus(Left, Rigth), Sol) :-
  24.         evaluate(Left, LeftResult),
  25.         evaluate(Rigth, RigthResult),
  26.         Sol = LeftResult + RigthResult.
  27.  
  28.     evaluate(sub(Left, Rigth), Sol) :-
  29.         evaluate(Left, LeftResult),
  30.         evaluate(Rigth, RigthResult),
  31.         Sol = LeftResult - RigthResult.
  32.  
  33.     evaluate(mul(Left, Rigth), Sol) :-
  34.         evaluate(Left, LeftResult),
  35.         evaluate(Rigth, RigthResult),
  36.         Sol = LeftResult * RigthResult.
  37.  
  38.     evaluate(dev(Left, Rigth), Sol) :-
  39.         evaluate(Left, LeftResult),
  40.         evaluate(Rigth, RigthResult),
  41.         Sol = LeftResult / RigthResult.
  42.  
  43.     evaluate(num(X), Sol) :- Sol = X.
  44.  
  45. goal
  46.     % evaluate(plus(num(2), num(2)), X).      % 2 + 2 = 4
  47.     % evaluate(plus(mul(num(2), num(4)), mul(num(3), num(3))), X).      %  (2 * 4) + (3 * 3) = 8 + 9 = 17
  48.     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