Gistrec icon

Пролог 5 лаба

Gistrec | PRO | 12/11/18 08:56:12 AM UTC | 0 ⭐ | 7291 👁️ | Never ⏰ | []
Prolog |

1.58 KB

|

None

|

0 👍

/

0 👎

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

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎