mini_kraken 0.2.01 → 0.2.02

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f51855ac3179a111a4ace328340402fa167818773086076abf90ed845c31d248
4
- data.tar.gz: f6bde0d3d7b872461d7cb0b087eaab821240f14317445e95f4d832d09af51e2f
3
+ metadata.gz: 24222422e142dde60f6f5a3c92ca1b4967eb358f26d29a0d834f719d25fcab11
4
+ data.tar.gz: 855880806c2210763e6c77d442f8d0463c39b9bde81072ff91f65ca21a275998
5
5
  SHA512:
6
- metadata.gz: ae6319164a2f6212bdbdea35dd5b5befa86648b685063dea79d220b70e5852c3e8b343d2d37ebfe6584aa3966b44174e91df2866d63e03a219a0008a5b382d66
7
- data.tar.gz: 70eb204ab842ea45527bd5ca8661dcd98081422cae4d6848d220bc70e080da94b3b7078f3602f1143535821a9894309b9bec39ec5f4d6c60edcfd21cfa5c8f4f
6
+ metadata.gz: e7840d5f469d0924b5018a87ca9e349f7c17f81fb23c1b8001890f9b5ca752125fae2de08eb10af1e8fc430347dba3c1a635e25fe7c188196f93415ccaecbe95
7
+ data.tar.gz: 3a16f04afa89e31dbe572af6c26eeafb169143dc5d55419f4db1ee0c90b0268c60e0a1bee643a3bcdce769e3fd524dd6be37b8ad60211d814321f5b90e7f3350
@@ -1,10 +1,17 @@
1
+ ## [0.2.02] - 2020-08-08
2
+ - The DSL (Domain Specific Language) now supports `conde` and passes all examples from Chapter 1.
3
+
4
+ ### NEW
5
+ - Method`Glue::DSL#conde` to implement conde goals.
6
+ - Method `KBoolean#to_s` returns a text representation of a boolean value.
7
+
1
8
  ## [0.2.01] - 2020-08-07
2
9
  - The DSL (Domain Specific Language) now supports `defrel` and boolean literals.
3
10
 
4
11
  ### CHANGED
5
12
  - Constructor `DefRelation#initialize` now freezes any new class instance.
6
13
  - Constructor `GoalTemplate#initialize` now freezes any new class instance.
7
- - Mixin module `Core::DSL` new method `defrel` to build custom relations.
14
+ - Mixin module `Glue::DSL` new method `defrel` to build custom relations.
8
15
  - File `.rubocop.yml` to please Rubocop 0.89
9
16
 
10
17
  ## [0.2.00] - 2020-07-12
@@ -6,10 +6,10 @@
6
6
  require_relative './mini_kraken/version'
7
7
  require_relative './mini_kraken/glue/dsl'
8
8
 
9
-
10
- # End of file
11
-
12
9
  module MiniKraken
13
10
  class Error < StandardError; end
14
11
  # Your code goes here...
15
12
  end
13
+
14
+ # End of file
15
+
@@ -7,7 +7,7 @@ module MiniKraken
7
7
  # A formal reference represents the occurrence of a formal argument name in a
8
8
  # goal template argument list.
9
9
  class FormalRef < BaseArg
10
- # @return [String]
10
+ # @return [String] The name of a formal argument.
11
11
  attr_reader :name
12
12
 
13
13
  def initialize(aName)
@@ -11,6 +11,10 @@ module MiniKraken
11
11
  def initialize(aValue)
12
12
  super(validated_value(aValue))
13
13
  end
14
+
15
+ def to_s
16
+ value.to_s
17
+ end
14
18
 
15
19
  private
16
20
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'set'
4
4
  require_relative '../core/any_value'
5
+ require_relative '../core/conde'
5
6
  require_relative '../core/conj2'
6
7
  require_relative '../core/cons_cell'
7
8
  require_relative '../core/def_relation'
@@ -10,6 +11,7 @@ require_relative '../core/equals'
10
11
  require_relative '../core/fail'
11
12
  require_relative '../core/formal_arg'
12
13
  require_relative '../core/formal_ref'
14
+ require_relative '../glue/fresh_env'
13
15
  require_relative '../core/goal_template'
14
16
  require_relative '../core/k_boolean'
15
17
  require_relative '../core/k_symbol'
@@ -33,6 +35,19 @@ module MiniKraken
33
35
  program.run
34
36
  end
35
37
 
38
+ def conde(*goals)
39
+ # require 'debug'
40
+ args = goals.map do |goal_maybe|
41
+ if goal_maybe.kind_of?(Array)
42
+ goal_maybe.map { |g| convert(g)}
43
+ else
44
+ convert(goal_maybe)
45
+ end
46
+ end
47
+
48
+ Core::Goal.new(Core::Conde.instance, args)
49
+ end
50
+
36
51
  # conj2 stands for conjunction of two arguments.
37
52
  # Returns a goal linked to the Core::Conj2 relation.
38
53
  # The rule of that relation succeeds when both arguments succeed.
@@ -142,6 +157,8 @@ module MiniKraken
142
157
  converted = anArgument
143
158
  when Core::FormalRef
144
159
  converted = anArgument
160
+ when FreshEnv
161
+ converted = anArgument
145
162
  when Core::Goal
146
163
  converted = anArgument
147
164
  when Core::GoalTemplate
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MiniKraken
4
- VERSION = '0.2.01'
4
+ VERSION = '0.2.02'
5
5
  end
@@ -58,7 +58,7 @@ module MiniKraken
58
58
  expect { subject.solver_for([pea, succeeds], env) }.to raise_error(err)
59
59
  end
60
60
 
61
- it 'should fails if when all goals fail' do
61
+ it 'should fail when all goals fail' do
62
62
  solver = subject.solver_for([fails, fails, fails], env)
63
63
  expect(solver.resume).not_to be_successful
64
64
  expect(solver.resume).to be_nil
@@ -101,6 +101,12 @@ module MiniKraken
101
101
  # Default Ruby representation, different value
102
102
  expect(subject == false).to be_falsy
103
103
  end
104
+
105
+ it 'provides a text representation of itself' do
106
+ expect(subject.to_s).to eq('true')
107
+ other = KBoolean.new('#f')
108
+ expect(other.to_s).to eq('false')
109
+ end
104
110
  end # context
105
111
  end # describe
106
112
  end # module
@@ -565,9 +565,7 @@ module MiniKraken
565
565
 
566
566
  defrel_teacupo
567
567
  result = run_star(%w[x y], [teacupo(x), teacupo(x)])
568
-
569
- expect(result.car).to eq(cons(:tea, cons(:_0)))
570
- expect(result.cdr.car).to eq(cons(:cup, cons(:_0)))
568
+ expect(result.to_s).to eq('((:tea _0) (:cup _0))')
571
569
  end
572
570
 
573
571
  it 'passes frame 1:87' do
@@ -583,11 +581,90 @@ module MiniKraken
583
581
  conj2(equals('#f', x), teacupo(y))))
584
582
 
585
583
  # Order of solutions differs from RS book
584
+ expected = '((:tea _0) (:cup _0) (false :tea) (false :cup))'
585
+ expect(result.to_s).to eq(expected)
586
586
  expect(result.car).to eq(cons(:tea, cons(:_0)))
587
587
  expect(result.cdr.car).to eq(cons(:cup, cons(:_0)))
588
588
  expect(result.cdr.cdr.car).to eq(cons(false, cons(:tea)))
589
589
  expect(result.cdr.cdr.cdr.car).to eq(cons(false, cons(:cup)))
590
590
  end
591
+
592
+ it 'supports conde and passes frame 1:88 (i)' do
593
+ # Reasoned S2, frame 1:88
594
+ # (run* (x y)
595
+ # (conde
596
+ # ((teacupo x) (teacupo x))
597
+ # ((== #f x) (teacupo y)))) ;; => ((#f tea)(#f cup)(tea _0)(cup _0))
598
+
599
+ defrel_teacupo
600
+ result = run_star(%w[x y], conde(
601
+ [teacupo(x), teacupo(x)],
602
+ [equals('#f', x), teacupo(y)]))
603
+
604
+ # Order of solutions differs from RS book
605
+ expected = '((:tea _0) (:cup _0) (false :tea) (false :cup))'
606
+ expect(result.to_s).to eq(expected)
607
+ end
608
+
609
+ it 'supports conde and passes frame 1:88 (ii)' do
610
+ # Reasoned S2, frame 1:88 (second part, a rewrite of 1:76)
611
+ # (run* (x y)
612
+ # (conde
613
+ # ((== 'split x) (== 'pea y))
614
+ # ((== 'red x) (== 'bean y)))) ;; => ((split pea)(red bean))
615
+ result = run_star(%w[x y], conde(
616
+ [equals(:split, x), equals(:pea, y)],
617
+ [equals(:red, x), equals(:bean, y)]))
618
+
619
+ expected = '((:split :pea) (:red :bean))'
620
+ expect(result.to_s).to eq(expected)
621
+ end
622
+
623
+ it 'passes frame 1:89' do
624
+ # Reasoned S2, frame 1:89 (rewrite of 1:62)
625
+ # (run* x
626
+ # (conde
627
+ # ((== 'olive x) fail)
628
+ # ('oil x))) ;; => (oil)
629
+
630
+ result = run_star('x', conde(
631
+ [equals(:olive, x), _fail],
632
+ equals(:oil, x)))
633
+
634
+ expect(result.to_s).to eq('(:oil)')
635
+ end
636
+
637
+ it 'passes frame 1:90' do
638
+ # Reasoned S2, frame 1:90
639
+ # (run* (x y)
640
+ # (conde
641
+ # ((fresh (z)
642
+ # (== 'lentil z)))
643
+ # ((== x y)))) ;; => ((_0 _1)(_0 _0))
644
+
645
+ result = run_star(%w[x y], conde(
646
+ [fresh(%w[z], equals(:lentil, z))],
647
+ [equals(x, y)]))
648
+
649
+ expect(result.to_s).to eq('((_0 _1) (_0 _0))')
650
+ end
651
+
652
+ it 'passes frame 1:91' do
653
+ # Reasoned S2, frame 1:91
654
+ # (run* (x y)
655
+ # (conde
656
+ # ((== 'split x) (== 'pea y))
657
+ # ((== 'red x) (== 'bean y))
658
+ # ((== 'green x) (== 'lentil y))))
659
+ # ;; => ((split pea)(red bean)(green lentil))
660
+ result = run_star(%w[x y], conde(
661
+ [equals(:split, x), equals(:pea, y)],
662
+ [equals(:red, x), equals(:bean, y)],
663
+ [equals(:green, x), equals(:lentil, y)]))
664
+
665
+ expected = '((:split :pea) (:red :bean) (:green :lentil))'
666
+ expect(result.to_s).to eq(expected)
667
+ end
591
668
  end # context
592
669
  end # describe
593
670
  end # module
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.2.01
4
+ version: 0.2.02
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-08-07 00:00:00.000000000 Z
11
+ date: 2020-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler