truthtable - truth table to logical formula

The truthtable library generates a truth table from a logical formula written in Ruby. The truth table can be converted to a logical formula.

Install

gem install 'truthtable'

Features

  • generate a truth table from a given block written in Ruby.

  • generate a formula from the table:

    • minimal one (obtained by Quine-McCluskey algorithm)

    • disjunctive normal form

    • conjunctive normal form

Usage

require 'truthtable'
  • puts, p and pp shows truth table

    puts TruthTable.new {|v| v[0] & v[1] }
    #=>
    v[0] v[1] | 
    ----------+--
     f    f   | f
     f    t   | f
     t    f   | f
     t    t   | t
    
    p TruthTable.new {|v| v[0] & v[1] }
    #=> #<TruthTable: !v[0]&!v[1]=>false !v[0]&v[1]=>false v[0]&!v[1]=>false v[0]&v[1]=>true>
    
    require 'pp'
    pp TruthTable.new {|v| v[0] & v[1] }
    #=>
    #<TruthTable:
     !v[0]&!v[1]=>false
     !v[0]& v[1]=>false
      v[0]&!v[1]=>false
      v[0]& v[1]=>true>
    
  • ‘?’ is shown for non-evaluated variable

    puts TruthTable.new {|v| v[0] && v[1] }'
    #=>
    v[0] v[1] | 
    ----------+--
     f    ?   | f
     t    f   | f
     t    t   | t
    
    puts TruthTable.new {|v| v[0] || v[1] }'
    #=>
    v[0] v[1] | 
    ----------+--
     f    f   | f
     f    t   | t
     t    ?   | t
    
    puts TruthTable.new {|v| !v[0] ? !v[1] : !v[2] }'
    #=>
    v[0] v[1] v[2] | 
    ---------------+--
     f    f    ?   | t
     f    t    ?   | f
     t    ?    f   | t
     t    ?    t   | f
    
  • formula generation

    p TruthTable.new {|v| !v[0] }.formula        #=> "!v[0]"
    p TruthTable.new {|v| v[0] & v[1] }.formula  #=> "v[0]&v[1]"
    p TruthTable.new {|v| v[0] | v[1] }.formula  #=> "v[0] | v[1]"
    p TruthTable.new {|v| v[0] ^ v[1] }.formula  #=> "!v[0]&v[1] | v[0]&!v[1]"
    p TruthTable.new {|v| v[0] == v[1] }.formula #=> "!v[0]&!v[1] | v[0]&v[1]"
    
  • shortcuts, && and ||, are not preserved

    p TruthTable.new {|v| v[0] && v[1] }.formula #=> "v[0]&v[1]"
    p TruthTable.new {|v| v[0] || v[1] }.formula #=> "v[0] | v[1]"
    
  • actually any expression (without side effect)

    p TruthTable.new {|v| v[0] ? !v[1] : v[1] }.formula #=> "!v[0]&v[1] | v[0]&!v[1]"
    
  • any number of inputs

    p TruthTable.new {|v| [v[0], v[1], v[2], v[3]].grep(true).length <= 3 }.formula
    #=> "!v[0] | !v[1] | !v[2] | !v[3]"
    

Reference Manual

See rdoc/classes/TruthTable.html or www.a-k-r.org/truthtable/rdoc/TruthTable.html

Home Page

www.a-k-r.org/truthtable/