Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Implementação de Somatórios em Elixir

Implementação de Somatórios em Elixir

Apresentação sobre um projeto de implementação e discussão das propriedades do somatório em uma linguagem funcional. Realizado como projeto acadêmico da disciplina de Fundamentos Matemáticos da Computação no IMD/UFRN. Código em https://github.com/jaimerson/fmc-elixir-somatorio

Jaimerson Araújo

December 04, 2015
Tweet

Other Decks in Programming

Transcript

  1. Funções de ordem superior • Funções são first- class citizens;

    • É possível compor funções; double = fn(number) -> number * 2 end plus_one = fn(number) -> number + 1 end double_plus_one = fn(number) -> double.(plus_one.(number)) end double_plus_one.(3) # => 8
  2. Exemplo de implementação de relações de recorrência defmodule Fibonacci do

    def up_to(n) when n >= 0 do (1..n) |> Enum.map(fn x -> at(x) end) end def at(1), do: 1 def at(2), do: 1 def at(n) do at(n - 1) + at(n - 2) end end Fibonacci.up_to 10 # => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
  3. defmodule FMC do def somatorio(start \\0, finish, callback) def somatorio(start,

    finish, callback) when start == finish do callback.(start) end def somatorio(start, finish, callback) do _somatorio(Enum.to_list(start..finish), callback) end defp _somatorio([], _), do: 0 defp _somatorio([head | tail], callback) do callback.(head) + _somatorio(tail, callback) end end
  4. defp _somatorio([], _), do: 0 defp _somatorio([head | tail], callback)

    do callback.(head) + _somatorio(tail, callback) end
  5. property "caso base" do for_all x in int do FMC.somatorio(x,

    x, &(&1)) == x end end property "caso recursivo" do for_all {x, y} in {int, int} do FMC.somatorio(x, y, &(&1)) == Enum.reduce(x..y, &(&1 + &2)) end end
  6. property "multiplicação por constante" do for_all {x, y} in {int,

    int} do FMC.somatorio(x, &(&1 * y)) == y * FMC.somatorio(x, &(&1)) end end
  7. property "soma de somatório = somatório da soma" do for_all

    {x, y} in {int, int} do summation_of_sum = FMC.somatorio(x, fn(a) -> a + y end) sum_of_summation = FMC.somatorio(x, &(&1)) + FMC.somatorio(x, fn(_) -> y end) summation_of_sum == sum_of_summation end end
  8. property "ajuste de índices" do for_all {m, n} in {int,

    int} do summation_one = FMC.somatorio(m, n, fn(i) -> i + 1 end) summation_two = FMC.somatorio(m + 1, n + 1, fn(i) -> i end) summation_one == summation_two end end
  9. property "somatório de 2^k = 2^n -1" do for_all {s}

    in {pos_integer} do sum = FMC.somatorio(s - 1, fn n -> :math.pow(2, n) end) function = :math.pow(2, s) - 1 sum == function end end