rubylog 2.0.1 → 2.1.0

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.
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
-