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

t()

@type t() ::
  integer()
  | %Guesswork.Constraint.Arithmetic.Polynomial{
      coefficients: %{required(integer()) => t()},
      var: Guesswork.Ast.Variable.t()
    }

Functions

build_logical_statement(poly, constraint, halt_on_error)

@spec build_logical_statement(
  t(),
  Guesswork.Constraint.Comparison.constraint(),
  boolean()
) ::
  Guesswork.Ast.Statement.t()

Translates the polynomial into logical statements.

decompose(poly, constraint, halt_on_error)

breaks a polynomial in 2 or 3 term statements.

equation(expr)

(macro)

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}

}, :>=}

negate(poly)

@spec negate(t()) :: t()

new(var)

@spec new(String.t()) :: t()

new(var, coefficients)

@spec new(String.t(), [integer()]) :: t()

normalize(poly)

@spec normalize(t()) :: t()

Removes any 0 coefficents from the polynomial. Note that this does not recurse.

plus(first, second)

@spec plus(t(), t()) :: t()

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
}

}

pop_coefficient(poly, coefficent, default \\ nil)

@spec pop_coefficient(t(), integer(), any()) :: {any(), t()}

pop_constant_term(poly)

@spec pop_constant_term(t()) :: {integer(), t()}

times(first, second)

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}
  }
}

}