mini_kraken 0.1.12 → 0.2.03
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/.rubocop.yml +334 -0
 - data/CHANGELOG.md +54 -0
 - data/README.md +95 -13
 - data/lib/mini_kraken.rb +7 -1
 - data/lib/mini_kraken/core/any_value.rb +5 -1
 - data/lib/mini_kraken/core/atomic_term.rb +1 -0
 - data/lib/mini_kraken/core/conde.rb +1 -1
 - data/lib/mini_kraken/core/conj2.rb +3 -3
 - data/lib/mini_kraken/core/cons_cell.rb +29 -1
 - data/lib/mini_kraken/core/cons_cell_visitor.rb +102 -0
 - data/lib/mini_kraken/core/def_relation.rb +4 -0
 - data/lib/mini_kraken/core/disj2.rb +2 -2
 - data/lib/mini_kraken/core/environment.rb +2 -2
 - data/lib/mini_kraken/core/equals.rb +60 -26
 - data/lib/mini_kraken/core/formal_ref.rb +2 -1
 - data/lib/mini_kraken/core/goal.rb +4 -2
 - data/lib/mini_kraken/core/goal_template.rb +44 -2
 - data/lib/mini_kraken/core/k_boolean.rb +4 -0
 - data/lib/mini_kraken/core/k_symbol.rb +11 -0
 - data/lib/mini_kraken/core/outcome.rb +11 -1
 - data/lib/mini_kraken/core/variable.rb +10 -4
 - data/lib/mini_kraken/core/variable_ref.rb +7 -0
 - data/lib/mini_kraken/core/vocabulary.rb +8 -3
 - data/lib/mini_kraken/glue/dsl.rb +236 -0
 - data/lib/mini_kraken/glue/fresh_env.rb +31 -3
 - data/lib/mini_kraken/glue/fresh_env_factory.rb +83 -0
 - data/lib/mini_kraken/glue/run_star_expression.rb +3 -5
 - data/lib/mini_kraken/version.rb +1 -1
 - data/mini_kraken.gemspec +6 -3
 - data/spec/.rubocop.yml +13 -0
 - data/spec/core/conde_spec.rb +10 -10
 - data/spec/core/conj2_spec.rb +7 -7
 - data/spec/core/cons_cell_spec.rb +35 -0
 - data/spec/core/cons_cell_visitor_spec.rb +144 -0
 - data/spec/core/def_relation_spec.rb +6 -5
 - data/spec/core/disj2_spec.rb +5 -5
 - data/spec/core/duck_fiber_spec.rb +2 -2
 - data/spec/core/equals_spec.rb +34 -21
 - data/spec/core/goal_spec.rb +2 -2
 - data/spec/core/k_boolean_spec.rb +6 -0
 - data/spec/core/k_symbol_spec.rb +4 -0
 - data/spec/core/outcome_spec.rb +8 -0
 - data/spec/core/variable_ref_spec.rb +3 -0
 - data/spec/glue/dsl_chap1_spec.rb +679 -0
 - data/spec/glue/dsl_chap2_spec.rb +100 -0
 - data/spec/glue/fresh_env_factory_spec.rb +97 -0
 - data/spec/glue/run_star_expression_spec.rb +11 -11
 - metadata +17 -4
 
| 
         @@ -0,0 +1,100 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative '../spec_helper' # Use the RSpec framework
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            # Load the class under test
         
     | 
| 
      
 6 
     | 
    
         
            +
            require_relative '../../lib/mini_kraken/glue/dsl'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            module MiniKraken
         
     | 
| 
      
 10 
     | 
    
         
            +
              module Glue
         
     | 
| 
      
 11 
     | 
    
         
            +
                describe 'DSL (Chap 2)' do
         
     | 
| 
      
 12 
     | 
    
         
            +
                  include DSL
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  context 'Chapter 2 examples:' do
         
     | 
| 
      
 15 
     | 
    
         
            +
                    let(:acorn) { cons(:a, cons(:c, cons(:o, cons(:r, cons(:n))))) }
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                    it 'accepts caro definition inspired from frame 2:6' do
         
     | 
| 
      
 18 
     | 
    
         
            +
                      # Reasoned S2, frame 2:6
         
     | 
| 
      
 19 
     | 
    
         
            +
                      # (defrel (caro p a)
         
     | 
| 
      
 20 
     | 
    
         
            +
                      #   (fresh (d)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      #   (== (cons a d) p)))
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                      # As 'p' has a special meaning in Ruby, the argument has been remaned to 'r'
         
     | 
| 
      
 24 
     | 
    
         
            +
                      caro_rel = defrel('caro', %w[r a]) do
         
     | 
| 
      
 25 
     | 
    
         
            +
                        fresh('d', equals(cons(a, d), r))
         
     | 
| 
      
 26 
     | 
    
         
            +
                      end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                      expect(caro_rel).to be_kind_of(Core::DefRelation)
         
     | 
| 
      
 29 
     | 
    
         
            +
                      expect(caro_rel.name).to eq('caro')
         
     | 
| 
      
 30 
     | 
    
         
            +
                      expect(caro_rel.arity).to eq(2)
         
     | 
| 
      
 31 
     | 
    
         
            +
                      expect(caro_rel.formals[0].name).to eq('r')
         
     | 
| 
      
 32 
     | 
    
         
            +
                      expect(caro_rel.formals[1].name).to eq('a')
         
     | 
| 
      
 33 
     | 
    
         
            +
                      g_template = caro_rel.goal_template
         
     | 
| 
      
 34 
     | 
    
         
            +
                      expect(g_template).to be_kind_of(FreshEnvFactory)
         
     | 
| 
      
 35 
     | 
    
         
            +
                      expect(g_template.names).to include('d')
         
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    # In Scheme:
         
     | 
| 
      
 39 
     | 
    
         
            +
                    # (defrel (caro p a)
         
     | 
| 
      
 40 
     | 
    
         
            +
                    #   (fresh (d)
         
     | 
| 
      
 41 
     | 
    
         
            +
                    #   (== (cons a d) p)))
         
     | 
| 
      
 42 
     | 
    
         
            +
                    # In Ruby, `p`is a stnadard Kernel method => replaced by `r`
         
     | 
| 
      
 43 
     | 
    
         
            +
                    def defrel_caro
         
     | 
| 
      
 44 
     | 
    
         
            +
                      defrel('caro', %w[r a]) { fresh('d', equals(cons(a, d), r)) }
         
     | 
| 
      
 45 
     | 
    
         
            +
                    end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                    it 'passes frame 2:3' do
         
     | 
| 
      
 48 
     | 
    
         
            +
                      defrel_caro
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                      # (run* q
         
     | 
| 
      
 51 
     | 
    
         
            +
                      #   (caro '(a c o r n) q)) ;; => (a)
         
     | 
| 
      
 52 
     | 
    
         
            +
                      result = run_star('q', caro(acorn, q))
         
     | 
| 
      
 53 
     | 
    
         
            +
                      expect(result.car).to eq(:a)
         
     | 
| 
      
 54 
     | 
    
         
            +
                    end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                    it 'passes frame 2:4' do
         
     | 
| 
      
 57 
     | 
    
         
            +
                      defrel_caro
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                      # (run* q
         
     | 
| 
      
 60 
     | 
    
         
            +
                      #   (caro '(a c o r n) 'a)) ;; => (_0)
         
     | 
| 
      
 61 
     | 
    
         
            +
                      result = run_star('q', caro(acorn, :a))
         
     | 
| 
      
 62 
     | 
    
         
            +
                      expect(result.car).to eq(:_0)
         
     | 
| 
      
 63 
     | 
    
         
            +
                    end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                    it 'passes frame 2:5' do
         
     | 
| 
      
 66 
     | 
    
         
            +
                      defrel_caro
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                      # (run* r
         
     | 
| 
      
 69 
     | 
    
         
            +
                      #   (fresh (x y)
         
     | 
| 
      
 70 
     | 
    
         
            +
                      #     (caro '(,r ,y) x)
         
     | 
| 
      
 71 
     | 
    
         
            +
                      #     (== 'pear x)));; r => (pear)
         
     | 
| 
      
 72 
     | 
    
         
            +
                      result = run_star('r', fresh(%w[x y],
         
     | 
| 
      
 73 
     | 
    
         
            +
                        [caro(cons(r, cons(y)), x),
         
     | 
| 
      
 74 
     | 
    
         
            +
                          equals(:pear, x)]))
         
     | 
| 
      
 75 
     | 
    
         
            +
                      expect(result.car).to eq(:pear)
         
     | 
| 
      
 76 
     | 
    
         
            +
                    end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                    it 'passes frame 2:8' do
         
     | 
| 
      
 79 
     | 
    
         
            +
                      defrel_caro
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                      # (run* r
         
     | 
| 
      
 82 
     | 
    
         
            +
                      #   (fresh (x y)
         
     | 
| 
      
 83 
     | 
    
         
            +
                      #     (caro '(grape raisin pear) x)
         
     | 
| 
      
 84 
     | 
    
         
            +
                      #     (caro '((a) (b) (c)) y)
         
     | 
| 
      
 85 
     | 
    
         
            +
                      #     (== (cons x y) r))) ;; r => ((grape a))
         
     | 
| 
      
 86 
     | 
    
         
            +
                      fruits = cons(:grape, cons(:raisin, cons(:pear)))
         
     | 
| 
      
 87 
     | 
    
         
            +
                      expect(fruits.to_s).to eq('(:grape :raisin :pear)')
         
     | 
| 
      
 88 
     | 
    
         
            +
                      abc = cons(cons(:a), cons(cons(:b), cons(cons(:c))))
         
     | 
| 
      
 89 
     | 
    
         
            +
                      expect(abc.to_s).to eq('((:a) (:b) (:c))')
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                      result = run_star('r', fresh(%w[x y],
         
     | 
| 
      
 92 
     | 
    
         
            +
                        [caro(fruits, x),
         
     | 
| 
      
 93 
     | 
    
         
            +
                          caro(abc, y),
         
     | 
| 
      
 94 
     | 
    
         
            +
                          equals(cons(x, y), r)]))
         
     | 
| 
      
 95 
     | 
    
         
            +
                      expect(result.car).to eq(cons(:grape, cons(:a)))
         
     | 
| 
      
 96 
     | 
    
         
            +
                    end
         
     | 
| 
      
 97 
     | 
    
         
            +
                  end # context
         
     | 
| 
      
 98 
     | 
    
         
            +
                end # describe
         
     | 
| 
      
 99 
     | 
    
         
            +
              end # module
         
     | 
| 
      
 100 
     | 
    
         
            +
            end # module
         
     | 
| 
         @@ -0,0 +1,97 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative '../../lib/mini_kraken/core/equals'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative '../../lib/mini_kraken/core/formal_arg'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require_relative '../../lib/mini_kraken/core/formal_ref'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require_relative '../../lib/mini_kraken/core/goal_template'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            require_relative '../support/factory_methods'
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            # Load the class under test
         
     | 
| 
      
 11 
     | 
    
         
            +
            require_relative '../../lib/mini_kraken/glue/fresh_env_factory'
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            module MiniKraken
         
     | 
| 
      
 15 
     | 
    
         
            +
              module Glue
         
     | 
| 
      
 16 
     | 
    
         
            +
                describe FreshEnvFactory do
         
     | 
| 
      
 17 
     | 
    
         
            +
                  include FactoryMethods
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  # (fresh (d) (== d r))
         
     | 
| 
      
 20 
     | 
    
         
            +
                  let(:r_formal_ref) { Core::FormalRef.new('r') }
         
     | 
| 
      
 21 
     | 
    
         
            +
                  let(:d_ref) { var_ref('d') }
         
     | 
| 
      
 22 
     | 
    
         
            +
                  let(:sample_goal_t) do
         
     | 
| 
      
 23 
     | 
    
         
            +
                    Core::GoalTemplate.new(Core::Equals.instance, [d_ref, r_formal_ref])
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  subject { FreshEnvFactory.new(['d'], sample_goal_t) }
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  context 'Initialization:' do
         
     | 
| 
      
 28 
     | 
    
         
            +
                    it 'should be initialized with names and a goal template' do
         
     | 
| 
      
 29 
     | 
    
         
            +
                      expect { FreshEnvFactory.new(['d'], sample_goal_t) }.not_to raise_error
         
     | 
| 
      
 30 
     | 
    
         
            +
                    end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                    it 'should know the variable names' do
         
     | 
| 
      
 33 
     | 
    
         
            +
                      expect(subject.names).to eq(['d'])
         
     | 
| 
      
 34 
     | 
    
         
            +
                    end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                    it 'should know the goal template' do
         
     | 
| 
      
 37 
     | 
    
         
            +
                      expect(subject.goal_template).to eq(sample_goal_t)
         
     | 
| 
      
 38 
     | 
    
         
            +
                    end
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end # context
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  context 'Factory for FreshEnv instances' do
         
     | 
| 
      
 42 
     | 
    
         
            +
                    # (defrel (caro r a)
         
     | 
| 
      
 43 
     | 
    
         
            +
                    #   (fresh (d)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    #   (== (cons a d) r)))
         
     | 
| 
      
 45 
     | 
    
         
            +
                    # ;; r, a are formal args, they part of caro signature
         
     | 
| 
      
 46 
     | 
    
         
            +
                    # ;; d is a formal ref argument
         
     | 
| 
      
 47 
     | 
    
         
            +
                    let(:pea) { k_symbol(:pea) }
         
     | 
| 
      
 48 
     | 
    
         
            +
                    let(:q_ref) { var_ref('q') }
         
     | 
| 
      
 49 
     | 
    
         
            +
                    let(:r_formal) { Core::FormalRef.new('r') }
         
     | 
| 
      
 50 
     | 
    
         
            +
                    let(:a_formal) { Core::FormalRef.new('a') }
         
     | 
| 
      
 51 
     | 
    
         
            +
                    let(:t_param1) { Core::ConsCell.new(a_formal, d_ref) }
         
     | 
| 
      
 52 
     | 
    
         
            +
                    let(:other_goal_t) do
         
     | 
| 
      
 53 
     | 
    
         
            +
                      Core::GoalTemplate.new(Core::Equals.instance, [t_param1, r_formal])
         
     | 
| 
      
 54 
     | 
    
         
            +
                    end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                    # (fresh (d) (== d r))
         
     | 
| 
      
 57 
     | 
    
         
            +
                    it 'should build FreshEnv instance with simple goal' do
         
     | 
| 
      
 58 
     | 
    
         
            +
                      created = subject.instantiate([r_formal], [pea])
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                      # Are variables correctly built?
         
     | 
| 
      
 61 
     | 
    
         
            +
                      expect(created).to be_kind_of(FreshEnv)
         
     | 
| 
      
 62 
     | 
    
         
            +
                      expect(created.vars['d']).to be_kind_of(Core::Variable)
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                      # Is the goal correectly built?
         
     | 
| 
      
 65 
     | 
    
         
            +
                      goal = created.goal
         
     | 
| 
      
 66 
     | 
    
         
            +
                      expect(goal.relation).to eq(Core::Equals.instance)
         
     | 
| 
      
 67 
     | 
    
         
            +
                      expect(goal.actuals[0]).to be_kind_of(Core::VariableRef)
         
     | 
| 
      
 68 
     | 
    
         
            +
                      expect(goal.actuals[0].name).to eq('d')
         
     | 
| 
      
 69 
     | 
    
         
            +
                      expect(goal.actuals[1]).to be_kind_of(Core::KSymbol)
         
     | 
| 
      
 70 
     | 
    
         
            +
                      expect(goal.actuals[1]).to eq(:pea)
         
     | 
| 
      
 71 
     | 
    
         
            +
                    end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                    it 'should build FreshEnv instance with goal' do
         
     | 
| 
      
 74 
     | 
    
         
            +
                      instance = FreshEnvFactory.new(['d'], other_goal_t)
         
     | 
| 
      
 75 
     | 
    
         
            +
                      acorn = cons(k_symbol(:a), cons(k_symbol(:c), cons(k_symbol(:o),
         
     | 
| 
      
 76 
     | 
    
         
            +
                        cons(k_symbol(:r), cons(k_symbol(:n))))))
         
     | 
| 
      
 77 
     | 
    
         
            +
                      created = instance.instantiate([r_formal, a_formal], [acorn, q_ref])
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                      # Are variables correctly built?
         
     | 
| 
      
 80 
     | 
    
         
            +
                      expect(created).to be_kind_of(FreshEnv)
         
     | 
| 
      
 81 
     | 
    
         
            +
                      expect(created.vars['d']).to be_kind_of(Core::Variable)
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                      # Is the goal correctly built?
         
     | 
| 
      
 84 
     | 
    
         
            +
                      goal = created.goal
         
     | 
| 
      
 85 
     | 
    
         
            +
                      expect(goal.relation).to eq(Core::Equals.instance)
         
     | 
| 
      
 86 
     | 
    
         
            +
                      expect(goal.actuals[0]).to be_kind_of(Core::ConsCell)
         
     | 
| 
      
 87 
     | 
    
         
            +
                      expect(goal.actuals[0].car).to be_kind_of(Core::VariableRef)
         
     | 
| 
      
 88 
     | 
    
         
            +
                      expect(goal.actuals[0].car.name).to eq('q')
         
     | 
| 
      
 89 
     | 
    
         
            +
                      expect(goal.actuals[0].cdr).to be_kind_of(Core::VariableRef)
         
     | 
| 
      
 90 
     | 
    
         
            +
                      expect(goal.actuals[0].cdr.name).to eq('d')
         
     | 
| 
      
 91 
     | 
    
         
            +
                      expect(goal.actuals[1]).to be_kind_of(Core::ConsCell)
         
     | 
| 
      
 92 
     | 
    
         
            +
                      expect(goal.actuals[1].to_s).to eq('(:a :c :o :r :n)')
         
     | 
| 
      
 93 
     | 
    
         
            +
                    end
         
     | 
| 
      
 94 
     | 
    
         
            +
                  end # context
         
     | 
| 
      
 95 
     | 
    
         
            +
                end # describe
         
     | 
| 
      
 96 
     | 
    
         
            +
              end # module
         
     | 
| 
      
 97 
     | 
    
         
            +
            end # module
         
     | 
| 
         @@ -23,6 +23,7 @@ module MiniKraken 
     | 
|
| 
       23 
23 
     | 
    
         
             
              module Glue
         
     | 
| 
       24 
24 
     | 
    
         
             
                describe RunStarExpression do
         
     | 
| 
       25 
25 
     | 
    
         
             
                  include FactoryMethods
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
       26 
27 
     | 
    
         
             
                  let(:pea) { k_symbol(:pea) }
         
     | 
| 
       27 
28 
     | 
    
         
             
                  let(:pod) { k_symbol(:pod) }
         
     | 
| 
       28 
29 
     | 
    
         
             
                  let(:sample_goal) { equals_goal(pea, pod) }
         
     | 
| 
         @@ -126,6 +127,7 @@ module MiniKraken 
     | 
|
| 
       126 
127 
     | 
    
         | 
| 
       127 
128 
     | 
    
         
             
                    it 'should return a null list with the succeed goal' do
         
     | 
| 
       128 
129 
     | 
    
         
             
                      instance = RunStarExpression.new('q', succeeds)
         
     | 
| 
      
 130 
     | 
    
         
            +
                      expect(instance.env.vars).to be_include('q')
         
     | 
| 
       129 
131 
     | 
    
         | 
| 
       130 
132 
     | 
    
         
             
                      # (display (run* q succeed)) ;; => (_0)
         
     | 
| 
       131 
133 
     | 
    
         
             
                      # Reasoned S2, frame 1:16
         
     | 
| 
         @@ -243,7 +245,7 @@ module MiniKraken 
     | 
|
| 
       243 
245 
     | 
    
         
             
                      instance = RunStarExpression.new('q', goal)
         
     | 
| 
       244 
246 
     | 
    
         | 
| 
       245 
247 
     | 
    
         
             
                      # Reasoned S2, frame 1:34
         
     | 
| 
       246 
     | 
    
         
            -
                      # (run* q (==  '(((,q)) pod) `(((pea)) pod))) ;; => (' 
     | 
| 
      
 248 
     | 
    
         
            +
                      # (run* q (==  '(((,q)) pod) `(((pea)) pod))) ;; => ('pea)
         
     | 
| 
       247 
249 
     | 
    
         
             
                      result = instance.run
         
     | 
| 
       248 
250 
     | 
    
         
             
                      expect(result.car).to eq(pea)
         
     | 
| 
       249 
251 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -264,8 +266,8 @@ module MiniKraken 
     | 
|
| 
       264 
266 
     | 
    
         
             
                    it 'should unify complex equality expressions (IV)' do
         
     | 
| 
       265 
267 
     | 
    
         
             
                      # Reasoned S2, frame 1:36
         
     | 
| 
       266 
268 
     | 
    
         
             
                      # (run* q (fresh (x) (==  '(((,q)) (,x)) `(((,x)) pod)))) ;; => ('pod)
         
     | 
| 
       267 
     | 
    
         
            -
                      expr1 = cons(cons(cons(ref_q)), ref_x)
         
     | 
| 
       268 
     | 
    
         
            -
                      expr2 = cons(cons(cons(ref_x)), pod)
         
     | 
| 
      
 269 
     | 
    
         
            +
                      expr1 = cons(cons(cons(ref_q)), cons(ref_x))
         
     | 
| 
      
 270 
     | 
    
         
            +
                      expr2 = cons(cons(cons(ref_x)), cons(pod))
         
     | 
| 
       269 
271 
     | 
    
         
             
                      goal = equals_goal(expr1, expr2)
         
     | 
| 
       270 
272 
     | 
    
         
             
                      fresh_env = FreshEnv.new(['x'], goal)
         
     | 
| 
       271 
273 
     | 
    
         
             
                      instance = RunStarExpression.new('q', fresh_env)
         
     | 
| 
         @@ -362,7 +364,6 @@ module MiniKraken 
     | 
|
| 
       362 
364 
     | 
    
         
             
                      expect(result.car).to eq(any_value(0))
         
     | 
| 
       363 
365 
     | 
    
         
             
                    end
         
     | 
| 
       364 
366 
     | 
    
         | 
| 
       365 
     | 
    
         
            -
                    # TODO: fix erratic RSpec failure
         
     | 
| 
       366 
367 
     | 
    
         
             
                    it 'should support conjunction of one succeed and a successful goal' do
         
     | 
| 
       367 
368 
     | 
    
         
             
                      subgoal = equals_goal(corn, ref_q)
         
     | 
| 
       368 
369 
     | 
    
         
             
                      goal = conj2_goal(succeeds, subgoal)
         
     | 
| 
         @@ -480,7 +481,7 @@ module MiniKraken 
     | 
|
| 
       480 
481 
     | 
    
         
             
                      # Reasoned S2, frame 1:62
         
     | 
| 
       481 
482 
     | 
    
         
             
                      # (run* x (disj2
         
     | 
| 
       482 
483 
     | 
    
         
             
                      #           (conj2 (== 'olive x) fail)
         
     | 
| 
       483 
     | 
    
         
            -
                      #           ('oil x))) ;; => (oil)
         
     | 
| 
      
 484 
     | 
    
         
            +
                      #           (== 'oil x))) ;; => (oil)
         
     | 
| 
       484 
485 
     | 
    
         
             
                      result = instance.run
         
     | 
| 
       485 
486 
     | 
    
         
             
                      expect(result.car).to eq(oil)
         
     | 
| 
       486 
487 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -510,7 +511,7 @@ module MiniKraken 
     | 
|
| 
       510 
511 
     | 
    
         | 
| 
       511 
512 
     | 
    
         
             
                      # Reasoned S2, frame 1:64
         
     | 
| 
       512 
513 
     | 
    
         
             
                      # (run* x (disj2
         
     | 
| 
       513 
     | 
    
         
            -
                      #           ('oil x)
         
     | 
| 
      
 514 
     | 
    
         
            +
                      #           (== 'oil x)
         
     | 
| 
       514 
515 
     | 
    
         
             
                      #           (conj2 (== 'olive x) succeed))) ;; => (oil olive)
         
     | 
| 
       515 
516 
     | 
    
         
             
                      result = instance.run
         
     | 
| 
       516 
517 
     | 
    
         
             
                      expect(result.car).to eq(oil)
         
     | 
| 
         @@ -529,11 +530,11 @@ module MiniKraken 
     | 
|
| 
       529 
530 
     | 
    
         | 
| 
       530 
531 
     | 
    
         
             
                      # Reasoned S2, frame 1:65
         
     | 
| 
       531 
532 
     | 
    
         
             
                      # (run* x (disj2
         
     | 
| 
       532 
     | 
    
         
            -
                      #           (conj2(== 'virgin x)  
     | 
| 
      
 533 
     | 
    
         
            +
                      #           (conj2(== 'virgin x) fail)
         
     | 
| 
       533 
534 
     | 
    
         
             
                      #           (disj2
         
     | 
| 
       534 
535 
     | 
    
         
             
                      #             (== 'olive x)
         
     | 
| 
       535 
536 
     | 
    
         
             
                      #             (dis2
         
     | 
| 
       536 
     | 
    
         
            -
                      #                
     | 
| 
      
 537 
     | 
    
         
            +
                      #               succeed
         
     | 
| 
       537 
538 
     | 
    
         
             
                      #               (== 'oil x))))) ;; => (olive _0 oil)
         
     | 
| 
       538 
539 
     | 
    
         
             
                      result = instance.run
         
     | 
| 
       539 
540 
     | 
    
         
             
                      expect(result.car).to eq(olive)
         
     | 
| 
         @@ -648,7 +649,7 @@ module MiniKraken 
     | 
|
| 
       648 
649 
     | 
    
         
             
                      expect(result.car.cdr.cdr.cdr).to be_nil
         
     | 
| 
       649 
650 
     | 
    
         
             
                    end
         
     | 
| 
       650 
651 
     | 
    
         | 
| 
       651 
     | 
    
         
            -
                    it 'should allow  
     | 
| 
      
 652 
     | 
    
         
            +
                    it 'should allow simplification of expressions' do
         
     | 
| 
       652 
653 
     | 
    
         
             
                      expr1 = equals_goal(split, ref_x)
         
     | 
| 
       653 
654 
     | 
    
         
             
                      expr2 = equals_goal(pea, ref_y)
         
     | 
| 
       654 
655 
     | 
    
         
             
                      goal = conj2_goal(expr1, expr2)
         
     | 
| 
         @@ -968,8 +969,7 @@ module MiniKraken 
     | 
|
| 
       968 
969 
     | 
    
         
             
                      #     ((== x y)))) ;; => ((_0 _1)(_0 _0))
         
     | 
| 
       969 
970 
     | 
    
         
             
                      result = instance.run
         
     | 
| 
       970 
971 
     | 
    
         
             
                      expect(result.car).to eq(cons(any_value(0), cons(any_value(1))))
         
     | 
| 
       971 
     | 
    
         
            -
                       
     | 
| 
       972 
     | 
    
         
            -
                      # expect(result.cdr.car).to eq(cons(any_value(0), cons(any_value(0))))
         
     | 
| 
      
 972 
     | 
    
         
            +
                      expect(result.cdr.car).to eq(cons(any_value(0), cons(any_value(0))))
         
     | 
| 
       973 
973 
     | 
    
         
             
                    end
         
     | 
| 
       974 
974 
     | 
    
         | 
| 
       975 
975 
     | 
    
         
             
                    it 'accepts conde with more than two condition lines' do
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: mini_kraken
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.03
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Dimitri Geshef
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2020- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-09-02 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: bundler
         
     | 
| 
         @@ -61,6 +61,7 @@ extra_rdoc_files: 
     | 
|
| 
       61 
61 
     | 
    
         
             
            - README.md
         
     | 
| 
       62 
62 
     | 
    
         
             
            files:
         
     | 
| 
       63 
63 
     | 
    
         
             
            - ".rspec"
         
     | 
| 
      
 64 
     | 
    
         
            +
            - ".rubocop.yml"
         
     | 
| 
       64 
65 
     | 
    
         
             
            - ".travis.yml"
         
     | 
| 
       65 
66 
     | 
    
         
             
            - CHANGELOG.md
         
     | 
| 
       66 
67 
     | 
    
         
             
            - Gemfile
         
     | 
| 
         @@ -79,6 +80,7 @@ files: 
     | 
|
| 
       79 
80 
     | 
    
         
             
            - lib/mini_kraken/core/conde.rb
         
     | 
| 
       80 
81 
     | 
    
         
             
            - lib/mini_kraken/core/conj2.rb
         
     | 
| 
       81 
82 
     | 
    
         
             
            - lib/mini_kraken/core/cons_cell.rb
         
     | 
| 
      
 83 
     | 
    
         
            +
            - lib/mini_kraken/core/cons_cell_visitor.rb
         
     | 
| 
       82 
84 
     | 
    
         
             
            - lib/mini_kraken/core/def_relation.rb
         
     | 
| 
       83 
85 
     | 
    
         
             
            - lib/mini_kraken/core/designation.rb
         
     | 
| 
       84 
86 
     | 
    
         
             
            - lib/mini_kraken/core/disj2.rb
         
     | 
| 
         @@ -104,15 +106,19 @@ files: 
     | 
|
| 
       104 
106 
     | 
    
         
             
            - lib/mini_kraken/core/variable.rb
         
     | 
| 
       105 
107 
     | 
    
         
             
            - lib/mini_kraken/core/variable_ref.rb
         
     | 
| 
       106 
108 
     | 
    
         
             
            - lib/mini_kraken/core/vocabulary.rb
         
     | 
| 
      
 109 
     | 
    
         
            +
            - lib/mini_kraken/glue/dsl.rb
         
     | 
| 
       107 
110 
     | 
    
         
             
            - lib/mini_kraken/glue/fresh_env.rb
         
     | 
| 
      
 111 
     | 
    
         
            +
            - lib/mini_kraken/glue/fresh_env_factory.rb
         
     | 
| 
       108 
112 
     | 
    
         
             
            - lib/mini_kraken/glue/run_star_expression.rb
         
     | 
| 
       109 
113 
     | 
    
         
             
            - lib/mini_kraken/version.rb
         
     | 
| 
       110 
114 
     | 
    
         
             
            - mini_kraken.gemspec
         
     | 
| 
      
 115 
     | 
    
         
            +
            - spec/.rubocop.yml
         
     | 
| 
       111 
116 
     | 
    
         
             
            - spec/core/association_spec.rb
         
     | 
| 
       112 
117 
     | 
    
         
             
            - spec/core/association_walker_spec.rb
         
     | 
| 
       113 
118 
     | 
    
         
             
            - spec/core/conde_spec.rb
         
     | 
| 
       114 
119 
     | 
    
         
             
            - spec/core/conj2_spec.rb
         
     | 
| 
       115 
120 
     | 
    
         
             
            - spec/core/cons_cell_spec.rb
         
     | 
| 
      
 121 
     | 
    
         
            +
            - spec/core/cons_cell_visitor_spec.rb
         
     | 
| 
       116 
122 
     | 
    
         
             
            - spec/core/def_relation_spec.rb
         
     | 
| 
       117 
123 
     | 
    
         
             
            - spec/core/disj2_spec.rb
         
     | 
| 
       118 
124 
     | 
    
         
             
            - spec/core/duck_fiber_spec.rb
         
     | 
| 
         @@ -128,6 +134,9 @@ files: 
     | 
|
| 
       128 
134 
     | 
    
         
             
            - spec/core/variable_ref_spec.rb
         
     | 
| 
       129 
135 
     | 
    
         
             
            - spec/core/variable_spec.rb
         
     | 
| 
       130 
136 
     | 
    
         
             
            - spec/core/vocabulary_spec.rb
         
     | 
| 
      
 137 
     | 
    
         
            +
            - spec/glue/dsl_chap1_spec.rb
         
     | 
| 
      
 138 
     | 
    
         
            +
            - spec/glue/dsl_chap2_spec.rb
         
     | 
| 
      
 139 
     | 
    
         
            +
            - spec/glue/fresh_env_factory_spec.rb
         
     | 
| 
       131 
140 
     | 
    
         
             
            - spec/glue/fresh_env_spec.rb
         
     | 
| 
       132 
141 
     | 
    
         
             
            - spec/glue/run_star_expression_spec.rb
         
     | 
| 
       133 
142 
     | 
    
         
             
            - spec/mini_kraken_spec.rb
         
     | 
| 
         @@ -144,9 +153,9 @@ require_paths: 
     | 
|
| 
       144 
153 
     | 
    
         
             
            - lib
         
     | 
| 
       145 
154 
     | 
    
         
             
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
       146 
155 
     | 
    
         
             
              requirements:
         
     | 
| 
       147 
     | 
    
         
            -
              - - " 
     | 
| 
      
 156 
     | 
    
         
            +
              - - "~>"
         
     | 
| 
       148 
157 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       149 
     | 
    
         
            -
                  version: ' 
     | 
| 
      
 158 
     | 
    
         
            +
                  version: '2.4'
         
     | 
| 
       150 
159 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       151 
160 
     | 
    
         
             
              requirements:
         
     | 
| 
       152 
161 
     | 
    
         
             
              - - ">="
         
     | 
| 
         @@ -163,6 +172,7 @@ test_files: 
     | 
|
| 
       163 
172 
     | 
    
         
             
            - spec/core/conde_spec.rb
         
     | 
| 
       164 
173 
     | 
    
         
             
            - spec/core/conj2_spec.rb
         
     | 
| 
       165 
174 
     | 
    
         
             
            - spec/core/cons_cell_spec.rb
         
     | 
| 
      
 175 
     | 
    
         
            +
            - spec/core/cons_cell_visitor_spec.rb
         
     | 
| 
       166 
176 
     | 
    
         
             
            - spec/core/def_relation_spec.rb
         
     | 
| 
       167 
177 
     | 
    
         
             
            - spec/core/disj2_spec.rb
         
     | 
| 
       168 
178 
     | 
    
         
             
            - spec/core/duck_fiber_spec.rb
         
     | 
| 
         @@ -178,6 +188,9 @@ test_files: 
     | 
|
| 
       178 
188 
     | 
    
         
             
            - spec/core/variable_ref_spec.rb
         
     | 
| 
       179 
189 
     | 
    
         
             
            - spec/core/variable_spec.rb
         
     | 
| 
       180 
190 
     | 
    
         
             
            - spec/core/vocabulary_spec.rb
         
     | 
| 
      
 191 
     | 
    
         
            +
            - spec/glue/dsl_chap1_spec.rb
         
     | 
| 
      
 192 
     | 
    
         
            +
            - spec/glue/dsl_chap2_spec.rb
         
     | 
| 
      
 193 
     | 
    
         
            +
            - spec/glue/fresh_env_factory_spec.rb
         
     | 
| 
       181 
194 
     | 
    
         
             
            - spec/glue/fresh_env_spec.rb
         
     | 
| 
       182 
195 
     | 
    
         
             
            - spec/glue/run_star_expression_spec.rb
         
     | 
| 
       183 
196 
     | 
    
         
             
            - spec/mini_kraken_spec.rb
         
     |