View Source Guesswork.Constraint.Arithmetic.Polynomial (Guesswork v0.8.0)
A canonical representation of a polynomial. Implicitly equal to zero
Taken from Peter Norvig's Paradigm of Artificial Intelligence Programming: Case Studies in Common Lisp, Chapter 15.
Summary
Functions
Translates the polynomial into logical statements.
breaks a polynomial in 2 or 3 term statements.
Builds a canonical polynomial from an elixir expression.
Removes any 0
coefficents from the polynomial.
Note that this does not recurse.
Adds two polynomials.
Multiplies two polynomial.
Types
@type t() :: integer() | %Guesswork.Constraint.Arithmetic.Polynomial{ coefficients: %{required(integer()) => t()}, var: Guesswork.Ast.Variable.t() }
Functions
@spec build_logical_statement( t(), Guesswork.Constraint.Comparison.constraint(), boolean() ) :: Guesswork.Ast.Statement.t()
Translates the polynomial into logical statements.
@spec decompose(t(), Guesswork.Constraint.Comparison.constraint(), boolean()) :: [ Guesswork.Constraint.Arithmetic.Statement.t() | :ok | :error ]
breaks a polynomial in 2 or 3 term statements.
Builds a canonical polynomial from an elixir expression.
## Examples
iex> Guesswork.Constraint.Arithmetic.Polynomial.equation(5) {5, :=} iex> Guesswork.Constraint.Arithmetic.Polynomial.equation(x) {%Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{1 => 1}
}, :=} iex> Guesswork.Constraint.Arithmetic.Polynomial.equation(-x) {%Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{1 => -1}
}, :=} iex> Guesswork.Constraint.Arithmetic.Polynomial.equation(y - x) {%Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{
0 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{1 => 1}
},
1 => -1
}
}, :=} iex> Guesswork.Constraint.Arithmetic.Polynomial.equation(y 3 - x x + 5) {%Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{
0 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{0 => 5, 1 => 3}
},
2 => -1
}
}, :=} iex> Guesswork.Constraint.Arithmetic.Polynomial.equation(y 3 - x x + 5 = 4) {%Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{
0 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{0 => 1, 1 => 3}
},
2 => -1
}
}, :=} iex> Guesswork.Constraint.Arithmetic.Polynomial.equation(x < 3) {%Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{0 => -3, 1 => 1}
}, :<} iex> Guesswork.Constraint.Arithmetic.Polynomial.equation(x <= 3) {%Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{0 => -3, 1 => 1}
}, :<=} iex> Guesswork.Constraint.Arithmetic.Polynomial.equation(x > 3) {%Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{0 => -3, 1 => 1}
}, :>} iex> Guesswork.Constraint.Arithmetic.Polynomial.equation(x >= 3) {%Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{0 => -3, 1 => 1}
}, :>=}
Removes any 0
coefficents from the polynomial.
Note that this does not recurse.
Adds two polynomials.
## Examples
iex> Guesswork.Constraint.Arithmetic.Polynomial.plus(3, 7) 10 iex> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, 2, 1]) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.plus(7) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{0 => 10, 1 => 2, 2 => 1}
} iex> -7 ...> |> Guesswork.Constraint.Arithmetic.Polynomial.plus( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, 2, 1]) ...> ) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{0 => -4, 1 => 2, 2 => 1}
} iex> -3 ...> |> Guesswork.Constraint.Arithmetic.Polynomial.plus( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, 2, 1]) ...> ) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{1 => 2, 2 => 1}
} iex> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [-5, -2, 0, 3]) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.plus( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, 2, 1]) ...> ) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{0 => -2, 2 => 1, 3 => 3}
} iex> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [-5, 1, 0, 3]) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.plus( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, 2, 1]) ...> ) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{0 => -2, 1 => 3, 2 => 1, 3 => 3}
} iex> Guesswork.Constraint.Arithmetic.Polynomial.new("y", [-5, 1]) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.plus( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, 2, 1]) ...> ) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{
0 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{0 => -2, 1 => 1}
},
1 => 2,
2 => 1
}
} iex> Guesswork.Constraint.Arithmetic.Polynomial.new("y", [-5, 1]) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.plus( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, 2, 1]) ...> ) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.plus( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("y", [6, -1, 1]) ...> ) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{
0 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{0 => 4, 2 => 1}
},
1 => 2,
2 => 1
}
}
Multiplies two polynomial.
## Examples
iex> Guesswork.Constraint.Arithmetic.Polynomial.times(3, 7) 21 iex> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, -1, 2]) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.times(3) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{0 => 9, 1 => -3, 2 => 6}
} iex> 0 ...> |> Guesswork.Constraint.Arithmetic.Polynomial.times( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, -1, 2]) ...> ) 0 iex> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [5, 1]) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.times( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, 2, 1]) ...> ) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{0 => 15, 1 => 13, 2 => 7, 3 => 1}
} iex> Guesswork.Constraint.Arithmetic.Polynomial.new("y", [5, 1]) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.times( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, 2, 1]) ...> ) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{
0 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{0 => 15, 1 => 3}
},
1 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{0 => 10, 1 => 2}
},
2 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{0 => 5, 1 => 1}
}
}
} iex> Guesswork.Constraint.Arithmetic.Polynomial.new("y", [5, 1]) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.times( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("x", [3, 2, 1]) ...> ) ...> |> Guesswork.Constraint.Arithmetic.Polynomial.times( ...> Guesswork.Constraint.Arithmetic.Polynomial.new("y", [0, 2]) ...> ) %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "x"},
coefficients: %{
0 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{1 => 30, 2 => 6}
},
1 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{1 => 20, 2 => 4}
},
2 => %Guesswork.Constraint.Arithmetic.Polynomial{
var: %Guesswork.Ast.Variable{display: "y"},
coefficients: %{1 => 10, 2 => 2}
}
}
}