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
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎