Toggle navigation
?
users online
Logout
Open hangout
Open chat for current file
:- set_prolog_flag(double_quotes,chars). :- use_module(library(dcg/basics)). % Sum rule for derivatives derivative(X, A+B, DA+DB) :- derivative(X, A, DA), derivative(X, B, DB). % Difference rule for derivatives derivative(X, A-B, DA-DB) :- derivative(X, A, DA), derivative(X, B, DB). % Product rule for derivatives derivative(X, A*B, (DA*B)+(A*DB)) :- derivative(X, A, DA), derivative(X, B, DB). % Quotient rule for derivatives derivative(X, A/B, (DA*B-A*DB)/(B^number(2))) :- derivative(X, A, DA), derivative(X, B, DB). % Power rule for derivatives derivative(X, A^B, A^(B-number(1))*(B*DA + A*log(A)*DB)) :- derivative(X, A, DA), derivative(X, B, DB). % Special case of constant factor rule for derivatives derivative(X, -E, -DE) :- derivative(X, E, DE). % Logarithmic derivative (+ chain rule) derivative(X, log(E), DE/E) :- derivative(X, E, DE). % Exponential derivative (+ chain rule) derivative(X, exp(E), DE*exp(E)) :- derivative(X, E, DE). % Sine derivative (+ chain rule) derivative(X, sin(E), DE*cos(E)) :- derivative(X, E, DE). % Cosine derivative (+ chain rule) derivative(X, cos(E), -DE*sin(E)) :- derivative(X, E, DE). % Tangent derivative (+ chain rule) derivative(X, tan(E), DE/(cos(E)^number(2))) :- derivative(X, E, DE). % Constant derivative derivative(_, number(_), number(0)). % Variable derivative derivative(X, variable(X), number(1)). derivative(X, variable(OtherX), number(0)) :- X \= OtherX. %%% %%% PARSER %%% % Enable tabled execution to eliminate left recursion :- table expression//1, term//1. % Describes expressions expression(A+B) --> expression(A), "+", term(B). expression(A-B) --> expression(A), "-", term(B). expression(E) --> term(E). % Describes expressions that have multiplication, % division, or a higher precedence operator at their % root. term(A*B) --> term(A), "*", factor(B). term(A/B) --> term(A), "/", factor(B). term(E) --> factor(E). % Describes expressions that have exponentiation, or % a higher precedence operator at their root. factor(A^B) --> unary(A), "^", factor(B). factor(E) --> unary(E). % Describes the remaining cases: unary operators, % function calls, use of parenthesis, numbers, and % variables. unary(-E) --> "-", expression(E). unary(E) --> "(", expression(E), ")". unary(log(E)) --> "log(", expression(E), ")". unary(exp(E)) --> "exp(", expression(E), ")". unary(sin(E)) --> "sin(", expression(E), ")". unary(cos(E)) --> "cos(", expression(E), ")". unary(tan(E)) --> "tan(", expression(E), ")". unary(number(N)) --> number(N). unary(variable(V)) --> letters(V). % Helper DCG rules letters([L]) --> letter(L). letters([L|Ls]) --> letter(L), letters(Ls). letter(L) --> [L], { char_type(L, alnum) }.