rubylog 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/Gemfile +2 -0
  2. data/Gemfile.lock +10 -0
  3. data/README.rdoc +1 -1
  4. data/RELEASE_NOTES.rdoc +7 -4
  5. data/VERSION +1 -1
  6. data/{examples → benchmark}/benchmark.rb +1 -0
  7. data/{examples → benchmark}/benchmark/compiled_not_indexed.rb +0 -0
  8. data/{examples → benchmark}/benchmark/compiled_sequence_indexed.rb +0 -0
  9. data/{examples → benchmark}/benchmark/indexed_procedure.rb +0 -0
  10. data/{examples → benchmark}/benchmark/prolog.rb +0 -0
  11. data/benchmark/benchmark/pure.rb +28 -0
  12. data/bin/rubylog +14 -0
  13. data/examples/a_plus_b.rb +2 -2
  14. data/examples/dcg.rb +22 -26
  15. data/examples/dcg2.rb +25 -30
  16. data/examples/divisors.rb +1 -3
  17. data/examples/factorial.rb +8 -15
  18. data/examples/file_search.rb +14 -13
  19. data/examples/hanoi.rb +1 -3
  20. data/examples/hu/csaladfa.rb +0 -4
  21. data/examples/n_queens.rb +17 -22
  22. data/examples/palindrome_detection.rb +1 -2
  23. data/examples/parsing.rb +19 -23
  24. data/examples/permutation.rb +1 -3
  25. data/examples/primality_by_division.rb +2 -2
  26. data/examples/sieve_of_eratosthenes.rb +2 -2
  27. data/examples/string_interpolation.rb +0 -3
  28. data/examples/tracing.rb +0 -4
  29. data/lib/rubylog/builtins/assumption.rb +2 -1
  30. data/lib/rubylog/builtins/file_system.rb +1 -1
  31. data/lib/rubylog/default_context.rb +3 -5
  32. data/lib/rubylog/mixins/kernel.rb +9 -1
  33. data/lib/rubylog/rubylog_files.rb +7 -0
  34. data/rubylog.gemspec +17 -22
  35. data/spec/inriasuite_spec.rb +851 -847
  36. data/spec/integration/dsl_spec.rb +32 -29
  37. data/spec/rspec/rubylog_spec.rb +46 -52
  38. data/spec/rubylog/assertable_spec.rb +92 -90
  39. data/spec/rubylog/builtins/arithmetics_spec.rb +92 -90
  40. data/spec/rubylog/builtins/assumption_spec.rb +59 -57
  41. data/spec/rubylog/builtins/ensure_spec.rb +6 -4
  42. data/spec/rubylog/builtins/file_system_spec.rb +41 -39
  43. data/spec/rubylog/builtins/logic_spec.rb +308 -306
  44. data/spec/rubylog/builtins/reflection_spec.rb +31 -29
  45. data/spec/rubylog/builtins/term_spec.rb +62 -60
  46. data/spec/rubylog/context_modules/demonstration_spec.rb +108 -106
  47. data/spec/rubylog/context_modules/predicates_spec.rb +29 -27
  48. data/spec/rubylog/context_modules/thats_spec.rb +77 -75
  49. data/spec/rubylog/dsl/array_splat_spec.rb +11 -9
  50. data/spec/rubylog/dsl/indicators_spec.rb +23 -21
  51. data/spec/rubylog/dsl/primitives_spec.rb +30 -28
  52. data/spec/rubylog/errors_spec.rb +13 -11
  53. data/spec/rubylog/interfaces/term_spec.rb +78 -76
  54. data/spec/rubylog/mixins/array_spec.rb +60 -58
  55. data/spec/rubylog/mixins/composite_term_spec.rb +55 -53
  56. data/spec/rubylog/mixins/proc_spec.rb +48 -46
  57. data/spec/rubylog/mixins/string_spec.rb +45 -43
  58. data/spec/rubylog/mixins/symbol_spec.rb +7 -5
  59. data/spec/rubylog/procedure_spec.rb +8 -6
  60. data/spec/rubylog/rule_spec.rb +10 -8
  61. data/spec/rubylog/structure_spec.rb +73 -71
  62. data/spec/rubylog/term_spec.rb +5 -3
  63. data/spec/rubylog/tracing_spec.rb +35 -33
  64. data/spec/rubylog/variable_spec.rb +249 -247
  65. data/spec/spec_helper.rb +4 -0
  66. metadata +54 -43
  67. data/examples/benchmark/pure.rb +0 -26
  68. data/examples/checkmate.rb +0 -88
  69. data/examples/combination.rb +0 -17
  70. data/examples/directory_structure_logic.rb +0 -17
  71. data/examples/dirlist.rb +0 -4
  72. data/examples/enumerators.rb +0 -30
  73. data/examples/hello.rb +0 -17
  74. data/examples/mice.rb +0 -92
  75. data/examples/mice2.rb +0 -37
  76. data/examples/object_oriented.rb +0 -14
  77. data/examples/prefix.rb +0 -13
  78. data/examples/primitives.rb +0 -26
  79. data/examples/sudoku.rb +0 -17
  80. data/spec/integration/theory_as_module_spec.rb +0 -20
  81. data/spec/integration/theory_as_module_with_include_spec.rb +0 -14
data/spec/spec_helper.rb CHANGED
@@ -15,3 +15,7 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
15
15
  RSpec.configure do |config|
16
16
 
17
17
  end
18
+
19
+ module RubylogSpec
20
+ extend Rubylog::Context
21
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubylog
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,36 +9,36 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-16 00:00:00.000000000Z
12
+ date: 2013-06-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ruby-prof
16
- requirement: &79320110 !ruby/object:Gem::Requirement
16
+ requirement: &1 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *79320110
24
+ version_requirements: *1
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &79319690 !ruby/object:Gem::Requirement
27
+ requirement: &2 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - <
31
31
  - !ruby/object:Gem::Version
32
32
  version: '3'
33
- - - ! '>='
33
+ - - '>='
34
34
  - !ruby/object:Gem::Version
35
35
  version: 2.8.0
36
36
  type: :development
37
37
  prerelease: false
38
- version_requirements: *79319690
38
+ version_requirements: *2
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: yard
41
- requirement: &79319150 !ruby/object:Gem::Requirement
41
+ requirement: &3 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ~>
@@ -46,43 +46,66 @@ dependencies:
46
46
  version: '0.7'
47
47
  type: :development
48
48
  prerelease: false
49
- version_requirements: *79319150
49
+ version_requirements: *3
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: bundler
52
- requirement: &79318590 !ruby/object:Gem::Requirement
52
+ requirement: &4 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
- - - ! '>='
55
+ - - '>='
56
56
  - !ruby/object:Gem::Version
57
57
  version: 1.0.0
58
58
  type: :development
59
59
  prerelease: false
60
- version_requirements: *79318590
60
+ version_requirements: *4
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: jeweler
63
- requirement: &79318130 !ruby/object:Gem::Requirement
63
+ requirement: &5 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
- - - ! '>='
66
+ - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.8.3
69
69
  type: :development
70
70
  prerelease: false
71
- version_requirements: *79318130
71
+ version_requirements: *5
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: simplecov
74
- requirement: &79317710 !ruby/object:Gem::Requirement
74
+ requirement: &6 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
- - - ! '>='
77
+ - - '>='
78
78
  - !ruby/object:Gem::Version
79
79
  version: '0'
80
80
  type: :development
81
81
  prerelease: false
82
- version_requirements: *79317710
82
+ version_requirements: *6
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard
85
+ requirement: &7 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: *7
94
+ - !ruby/object:Gem::Dependency
95
+ name: guard-rspec
96
+ requirement: &8 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: *8
83
105
  description: Rubylog is a Prolog-like DSL for Ruby.
84
106
  email: kallo.bernat@gmail.com
85
- executables: []
107
+ executables:
108
+ - rubylog
86
109
  extensions: []
87
110
  extra_rdoc_files:
88
111
  - LICENSE.txt
@@ -98,39 +121,28 @@ files:
98
121
  - Rakefile
99
122
  - TODO.txt
100
123
  - VERSION
124
+ - benchmark/benchmark.rb
125
+ - benchmark/benchmark/compiled_not_indexed.rb
126
+ - benchmark/benchmark/compiled_sequence_indexed.rb
127
+ - benchmark/benchmark/indexed_procedure.rb
128
+ - benchmark/benchmark/prolog.rb
129
+ - benchmark/benchmark/pure.rb
130
+ - bin/rubylog
101
131
  - examples/a_plus_b.rb
102
- - examples/benchmark.rb
103
- - examples/benchmark/compiled_not_indexed.rb
104
- - examples/benchmark/compiled_sequence_indexed.rb
105
- - examples/benchmark/indexed_procedure.rb
106
- - examples/benchmark/prolog.rb
107
- - examples/benchmark/pure.rb
108
- - examples/checkmate.rb
109
- - examples/combination.rb
110
132
  - examples/dcg.rb
111
133
  - examples/dcg2.rb
112
- - examples/directory_structure_logic.rb
113
- - examples/dirlist.rb
114
134
  - examples/divisors.rb
115
- - examples/enumerators.rb
116
135
  - examples/factorial.rb
117
136
  - examples/file_search.rb
118
137
  - examples/hanoi.rb
119
- - examples/hello.rb
120
138
  - examples/hu/csaladfa.rb
121
- - examples/mice.rb
122
- - examples/mice2.rb
123
139
  - examples/n_queens.rb
124
- - examples/object_oriented.rb
125
140
  - examples/palindrome_detection.rb
126
141
  - examples/parsing.rb
127
142
  - examples/permutation.rb
128
- - examples/prefix.rb
129
143
  - examples/primality_by_division.rb
130
- - examples/primitives.rb
131
144
  - examples/sieve_of_eratosthenes.rb
132
145
  - examples/string_interpolation.rb
133
- - examples/sudoku.rb
134
146
  - examples/tracing.rb
135
147
  - lib/rspec/rubylog.rb
136
148
  - lib/rubylog.rb
@@ -171,6 +183,7 @@ files:
171
183
  - lib/rubylog/predicate.rb
172
184
  - lib/rubylog/primitive.rb
173
185
  - lib/rubylog/procedure.rb
186
+ - lib/rubylog/rubylog_files.rb
174
187
  - lib/rubylog/rule.rb
175
188
  - lib/rubylog/structure.rb
176
189
  - lib/rubylog/term.rb
@@ -247,8 +260,6 @@ files:
247
260
  - spec/inriasuite_spec.rb
248
261
  - spec/integration/custom_classes_spec.rb
249
262
  - spec/integration/dsl_spec.rb
250
- - spec/integration/theory_as_module_spec.rb
251
- - spec/integration/theory_as_module_with_include_spec.rb
252
263
  - spec/rspec/rubylog_spec.rb
253
264
  - spec/rubylog/assertable_spec.rb
254
265
  - spec/rubylog/builtins/arithmetics_spec.rb
@@ -290,16 +301,16 @@ require_paths:
290
301
  required_ruby_version: !ruby/object:Gem::Requirement
291
302
  none: false
292
303
  requirements:
293
- - - ! '>='
304
+ - - '>='
294
305
  - !ruby/object:Gem::Version
295
306
  version: '0'
296
307
  segments:
297
308
  - 0
298
- hash: 393356129
309
+ hash: -992188621
299
310
  required_rubygems_version: !ruby/object:Gem::Requirement
300
311
  none: false
301
312
  requirements:
302
- - - ! '>='
313
+ - - '>='
303
314
  - !ruby/object:Gem::Version
304
315
  version: '0'
305
316
  requirements: []
@@ -1,26 +0,0 @@
1
- # encoding: UTF-8
2
- require "rubylog"
3
- extend Rubylog::Context
4
-
5
- predicate_for $person_class, ".parent_of() .grandparent_of()"
6
-
7
- def make_tree(parent, levels)
8
- return if levels.zero?
9
-
10
- children = (1..DEGREES).map{random_person}
11
-
12
- children.each do |child|
13
- # add relationship
14
- parent.parent_of!(child)
15
- end
16
-
17
- children.each do |child|
18
- # make sub-tree
19
- make_tree(child, levels-1)
20
- end
21
- end
22
-
23
- make_tree(random_person, LEVELS)
24
-
25
- A.grandparent_of(B).if A.parent_of(X).and X.parent_of(B)
26
-
@@ -1,88 +0,0 @@
1
- require "rubylog"
2
-
3
-
4
- rubylog do
5
- predicate_for Array, ".on()"
6
-
7
- black, white = 0, 1
8
- pawn,rook,knight,bishop,queen,king = :pawn, :rook, :knight, :bishop, :queen, :king
9
-
10
- mark = :mark
11
-
12
- signs = {pawn: "p", rook:"r", knight:"n", bishop:"b", queen:"q", king:"k", mark:"x"}
13
-
14
- [black,pawn] .on! [5,7]
15
- [black,bishop].on! [8,1]
16
- [black,pawn] .on! [8,5]
17
- [black,king] .on! [8,6]
18
-
19
- [white,pawn] .on! [1,7]
20
- [white,king] .on! [1,8]
21
- [white,bishop].on! [2,8]
22
- [white,pawn] .on! [3,7]
23
- [white,pawn] .on! [5,5]
24
- [white,pawn] .on! [6,6]
25
- [white,knight].on! [6,8]
26
- [white,bishop].on! [7,2]
27
- [white,pawn] .on! [7,7]
28
- [white,pawn] .on! [8,4]
29
-
30
- predicate ":show"
31
-
32
- :show.if do
33
- (R_.in(1..8).and(R.is{9-R_})).each do
34
- F.in(1..8).each do
35
- print '.' unless prove [C,P].on([F,R]).and :cut!.and { print C==white ? signs[P].upcase : signs[P]; true }
36
- end
37
- puts
38
- end
39
- puts
40
- true
41
- end
42
-
43
- functor_for Rubylog::Structure, :attacks, :can_move_to
44
- functor_for Integer, :rook_move, :bishop_move, :squares, :squares_forward
45
- prefix_functor :knight_move, :pawn_attack, :pawn_move
46
-
47
-
48
- [C,king ].on(S).can_move_to(S1).if 1. rook_move(S,S1).or 1.bishop_move(S,S1)
49
- [C,queen ].on(S).can_move_to(S1).if ANY. rook_move(S,S1).or ANY.bishop_move(S,S1)
50
- [C,bishop ].on(S).can_move_to(S1).if ANY.bishop_move(S,S1)
51
- [C,knight ].on(S).can_move_to(S1).if knight_move(S,S1)
52
- [C,rook ].on(S).can_move_to(S1).if ANY. rook_move(S,S1)
53
-
54
- [white,pawn].on(S).can_move_to(S1).if pawn_move(S,S1)
55
- [black,pawn].on(S).can_move_to(S1).if pawn_move(S1,S)
56
- [white,pawn].on([F,2]).can_move_to!([F,4])
57
- [black,pawn].on([F,7]).can_move_to!([F,5])
58
-
59
- [white,pawn].on(S).attacks(S1).if! pawn_attack(S,S1)
60
- [black,pawn].on(S).attacks(S1).if! pawn_attack(S1,S)
61
- X.attacks(S1).if X.can_move_to(S1)
62
-
63
-
64
- N.squares_forward(A[1..8],B[1..8]).if B.is(A,:+,N)
65
- N.squares(A,B).if A.in(1..8).and B.in(1..8).and B.is(A,:+,N).or A.is(B,:+,N)
66
-
67
- N. rook_move([F ,R1],[F ,R2]).if N.squares(R1,R2)
68
- N. rook_move([F1,R ],[F2,R ]).if N.squares(F1,F2)
69
- N.bishop_move([F1,R1],[F2,R2]).if N.squares(R1,R2).and N.squares(F1,F2)
70
-
71
- knight_move([F1,R1],[F2,R2]).if((1.squares(F1,F2).and 2.squares(R1,R2))
72
- .or(1.squares(R1,R2).and 2.squares(F1,F2)))
73
- pawn_move( [F ,R1],[F ,R2]).if 1.squares_forward(R1,R2)
74
- pawn_attack([F1,R1],[F2,R2]).if R2.is(R1,:+,1).and 1.squares(F1,F2)
75
-
76
-
77
- functor_for Rubylog::Structure, :moved_to
78
-
79
- [C,P].on(S).moved_to(S1).if [C,P].on(S).and [C,P].on(S).can_move_to(S1).and [C,P].on(S).revoked.and [C,P].on(S1).assumed
80
-
81
- solve :show.and [C,P].on(S).moved_to(S1).and{ puts "#{C} #{P}: #{S} -> #{S1}"; true}.and :show
82
-
83
-
84
-
85
-
86
-
87
-
88
- end
@@ -1,17 +0,0 @@
1
- require "rubylog"
2
- extend Rubylog::Context
3
-
4
- predicate_for Array, ".choose(,,)"
5
- predicate_for Integer, ".one_less_than()"
6
-
7
- N.one_less_than(M).if M.sum_of(N,1)
8
-
9
- L.choose!(0,[],L)
10
- [A,*REST].choose(N[thats>0],CHOSEN,[A,*REM]).if REST.choose(N,CHOSEN,REM)
11
- [A,*REST].choose(N[thats>0],[A,*CHOSEN],REM).if N1.one_less_than(N).and REST.choose(N1,CHOSEN,REM)
12
-
13
- [1,2,3,4,5].choose(3,L,ANY).each do
14
- L.choose(1,[A],REM).each do
15
- puts "#{A}: #{REM}"
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- require "rubylog"
2
-
3
- rubylog do
4
- predicate_for String, ".dir", ".contains()"
5
-
6
- ".git".dir!.contains! "Git repository"
7
- "bin".dir!.contains! "executables"
8
- "examples".dir!.contains! "examples and ideas for different applications of Rubylog"
9
- "lib".dir!.contains! "source code of Rubylog"
10
- "spec".dir!.contains! "functional tests written in RSpec"
11
- "logic".dir!.contains! "integration tests written in Rubylog"
12
-
13
- gitignore = File.readlines(".gitignore").map{|l| l.chop}
14
- check X.in(Y.dir.map{Y}).iff(X.in(Y.dirname_in(".").and(Y.not_in(gitignore)).map{Y}))
15
-
16
- end
17
-
data/examples/dirlist.rb DELETED
@@ -1,4 +0,0 @@
1
- require "rubylog"
2
- extend Rubylog::Context
3
-
4
-
@@ -1,30 +0,0 @@
1
- $:.unshift File.dirname(__FILE__)+"/../lib"
2
- require 'rubylog'
3
-
4
- rubylog do
5
- self.default_subject = Symbol
6
- predicate ".likes()"
7
-
8
- :john.likes! :beer
9
- :john.likes! :milk
10
- :john.likes! :water
11
-
12
- :jane.likes! :milk
13
- :jane.likes! :water
14
-
15
- :jeff.likes! :water
16
- :jeff.likes! :milk
17
- :jeff.likes! :juice
18
-
19
- check A.likes(:beer).all A.likes(:water)
20
- check A.likes(:beer).any A.likes(B).and B.is_not :water
21
- check A.likes(:milk).iff A.likes(:water)
22
- check A.likes(:beer).iff A.is(:john)
23
-
24
- check all(X.likes(:juice), X.likes(:beer).false)
25
- check any(X.likes(:water), X.likes(:juice))
26
- check one(X.likes :juice)
27
- check one(X.likes :milk).false
28
- check none(X.likes :palinka)
29
- check iff A.likes(:milk), A.likes(:water)
30
- end
data/examples/hello.rb DELETED
@@ -1,17 +0,0 @@
1
- $:.unshift File.dirname(__FILE__)+"/../lib"
2
-
3
- require 'rubylog'
4
-
5
-
6
- rubylog do
7
- predicate_for String, ".written :hello"
8
-
9
- X.written.if {puts X; true}
10
-
11
- :hello.if "Hello world!".written
12
- end
13
-
14
- rubylog do
15
- solve :hello
16
- end
17
-
data/examples/mice.rb DELETED
@@ -1,92 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $:.unshift File.dirname(__FILE__)+"/../lib"
3
- # This is a solution for a math problem.
4
- #
5
- # Mafia the black cat plays a game. She has N cups with 0 or 1 mouse under each.
6
- # She peeks under some cups one by one to see if there is a mouse under them.
7
- # What she wants to find out is whether there are two cups next to each other
8
- # which both have a mouse. She found that for some number of cups she has to
9
- # peek under every cup to decide if there are two adjacent ones with a mouse.
10
- # In this case she considers the task hard. For which N's does she consider it
11
- # hard (N<=2013)?
12
-
13
- require "rubylog"
14
- require "rubylog/builtins/assumption"
15
- extend Rubylog::Context
16
-
17
-
18
- class Cup < Struct.new :i
19
- extend Rubylog::Context
20
-
21
- def inspect
22
- "##{i}"
23
- end
24
-
25
- # A cup can be peeked: it has mouse or not
26
- predicate %w(.peeked .has_mouse .seen )
27
- C.peeked.if C.has_mouse.assumed.or(:true).and C.seen.assumed
28
-
29
- # A cup can be guessed: it has mouse or not
30
- predicate %w(.guessed)
31
- C.guessed.if C.has_mouse.assumed.or(:true)
32
-
33
- end
34
-
35
-
36
- class CupSet
37
- extend Rubylog::Context
38
-
39
- def initialize n
40
- @cups = (1..n).map {|i| Cup.new i }
41
- end
42
-
43
- def each &block
44
- @cups.each &block
45
- end
46
-
47
- def [] index
48
- @cups[index]
49
- end
50
-
51
- # A set has neighbors if
52
- predicate %w(.has_neighbors)
53
- CS.has_neighbors.if [C,D].in{CS[0..-2].zip(CS[1..-1] || [])}.and C.has_mouse.and D.has_mouse
54
-
55
- # A predicate definitely solves a set if there is no ambiguity
56
- predicate_for Rubylog::Goal, %w(.definitely_solves())
57
- T.definitely_solves(CS).if T.any(CS.has_neighbors).and(T.any(CS.has_neighbors.false)).false
58
-
59
- # A trial consist of peeking some cups
60
- predicate_for Rubylog::Goal, %w(.trial_for())
61
- T.trial_for(CS).if T.is{C.in(CS).map{C.peeked.or :true}.inject(:true,&:and)}.and T
62
-
63
- # A set is easy if can be definitely solved by a trial that has not seen all
64
- # cups. A set is had if it cannot.
65
- predicate %w(.easy() .hard)
66
- CS.easy(Peeks).if any T.trial_for(CS).and(C.in(CS).all(C.seen).false).definitely_solves(CS).and(Peeks.is{D.in(CS).and(D.peeked).map{D}})
67
- CS.hard.if CS.easy.false
68
-
69
- end
70
-
71
-
72
- N.in(0..4).each do
73
- puts "#{N}:"
74
- CS.is{CupSet.new(N)}.each do
75
-
76
- C.in{CS}.each { p C }
77
- T.trial_for(CS).each { p T }
78
-
79
- easy = false
80
- CS.easy(Peeks).each do
81
- puts "easy: #{Peeks.inspect}"
82
- easy = true
83
- end
84
- puts "hard" if not easy
85
- end
86
- puts
87
- end
88
-
89
-
90
-
91
-
92
-