rubylog 0.0.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 (124) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +18 -0
  4. data/Gemfile.lock +64 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +96 -0
  7. data/Rakefile +53 -0
  8. data/VERSION +1 -0
  9. data/examples/4queens.rb +10 -0
  10. data/examples/calculation.rb +12 -0
  11. data/examples/concepts.rb +46 -0
  12. data/examples/factorial.rb +16 -0
  13. data/examples/fp.rb +56 -0
  14. data/examples/hello.rb +9 -0
  15. data/examples/historia_de_espana.rb +31 -0
  16. data/examples/idea.rb +143 -0
  17. data/examples/lists.rb +5 -0
  18. data/examples/mechanika.rb +409 -0
  19. data/examples/parse.rb +15 -0
  20. data/examples/theory.rb +20 -0
  21. data/lib/array.rb +24 -0
  22. data/lib/class.rb +11 -0
  23. data/lib/method.rb +4 -0
  24. data/lib/object.rb +5 -0
  25. data/lib/proc.rb +4 -0
  26. data/lib/rubylog/builtins.rb +193 -0
  27. data/lib/rubylog/callable.rb +20 -0
  28. data/lib/rubylog/clause.rb +113 -0
  29. data/lib/rubylog/composite_term.rb +38 -0
  30. data/lib/rubylog/dsl/constants.rb +15 -0
  31. data/lib/rubylog/dsl/first_order_functors.rb +9 -0
  32. data/lib/rubylog/dsl/global_functors.rb +3 -0
  33. data/lib/rubylog/dsl/second_order_functors.rb +8 -0
  34. data/lib/rubylog/dsl.rb +52 -0
  35. data/lib/rubylog/errors.rb +18 -0
  36. data/lib/rubylog/internal_helpers.rb +16 -0
  37. data/lib/rubylog/predicate.rb +34 -0
  38. data/lib/rubylog/proc_method_additions.rb +69 -0
  39. data/lib/rubylog/term.rb +20 -0
  40. data/lib/rubylog/theory.rb +133 -0
  41. data/lib/rubylog/unifiable.rb +19 -0
  42. data/lib/rubylog/variable.rb +97 -0
  43. data/lib/rubylog.rb +39 -0
  44. data/lib/symbol.rb +35 -0
  45. data/rubylog.gemspec +187 -0
  46. data/script/inriasuite2spec +0 -0
  47. data/script/inriasuite2spec.pl +22 -0
  48. data/spec/bartak_guide_spec.rb +91 -0
  49. data/spec/inriasuite/README +122 -0
  50. data/spec/inriasuite/abolish +18 -0
  51. data/spec/inriasuite/and +9 -0
  52. data/spec/inriasuite/arg +32 -0
  53. data/spec/inriasuite/arith_diff +10 -0
  54. data/spec/inriasuite/arith_eq +10 -0
  55. data/spec/inriasuite/arith_gt +10 -0
  56. data/spec/inriasuite/arith_gt= +10 -0
  57. data/spec/inriasuite/arith_lt +10 -0
  58. data/spec/inriasuite/arith_lt= +10 -0
  59. data/spec/inriasuite/asserta +18 -0
  60. data/spec/inriasuite/assertz +16 -0
  61. data/spec/inriasuite/atom +12 -0
  62. data/spec/inriasuite/atom_chars +19 -0
  63. data/spec/inriasuite/atom_codes +15 -0
  64. data/spec/inriasuite/atom_concat +19 -0
  65. data/spec/inriasuite/atom_length +12 -0
  66. data/spec/inriasuite/atomic +11 -0
  67. data/spec/inriasuite/bagof +31 -0
  68. data/spec/inriasuite/call +19 -0
  69. data/spec/inriasuite/catch-and-throw +16 -0
  70. data/spec/inriasuite/char_code +13 -0
  71. data/spec/inriasuite/clause +16 -0
  72. data/spec/inriasuite/compound +12 -0
  73. data/spec/inriasuite/copy_term +25 -0
  74. data/spec/inriasuite/current_input +5 -0
  75. data/spec/inriasuite/current_output +5 -0
  76. data/spec/inriasuite/current_predicate +16 -0
  77. data/spec/inriasuite/current_prolog_flag +12 -0
  78. data/spec/inriasuite/cut +9 -0
  79. data/spec/inriasuite/fail +15 -0
  80. data/spec/inriasuite/file_manip +8 -0
  81. data/spec/inriasuite/findall +22 -0
  82. data/spec/inriasuite/float +10 -0
  83. data/spec/inriasuite/functor +41 -0
  84. data/spec/inriasuite/functor-bis +41 -0
  85. data/spec/inriasuite/halt +7 -0
  86. data/spec/inriasuite/if-then +10 -0
  87. data/spec/inriasuite/if-then-else +12 -0
  88. data/spec/inriasuite/inriasuite.obp +0 -0
  89. data/spec/inriasuite/inriasuite.pl +836 -0
  90. data/spec/inriasuite/integer +10 -0
  91. data/spec/inriasuite/is +11 -0
  92. data/spec/inriasuite/junk +0 -0
  93. data/spec/inriasuite/nonvar +11 -0
  94. data/spec/inriasuite/not_provable +12 -0
  95. data/spec/inriasuite/not_unify +15 -0
  96. data/spec/inriasuite/number +10 -0
  97. data/spec/inriasuite/number_chars +22 -0
  98. data/spec/inriasuite/number_codes +19 -0
  99. data/spec/inriasuite/once +11 -0
  100. data/spec/inriasuite/or +9 -0
  101. data/spec/inriasuite/repeat +5 -0
  102. data/spec/inriasuite/retract +10 -0
  103. data/spec/inriasuite/set_prolog_flag +21 -0
  104. data/spec/inriasuite/setof +36 -0
  105. data/spec/inriasuite/sub_atom +30 -0
  106. data/spec/inriasuite/t +1 -0
  107. data/spec/inriasuite/t_foo.pl +4 -0
  108. data/spec/inriasuite/term_diff +13 -0
  109. data/spec/inriasuite/term_eq +12 -0
  110. data/spec/inriasuite/term_gt +12 -0
  111. data/spec/inriasuite/term_gt= +12 -0
  112. data/spec/inriasuite/term_lt +12 -0
  113. data/spec/inriasuite/term_lt= +12 -0
  114. data/spec/inriasuite/true +7 -0
  115. data/spec/inriasuite/unify +18 -0
  116. data/spec/inriasuite.rb +20 -0
  117. data/spec/recursion_spec.rb +18 -0
  118. data/spec/rubylog/builtins/splits_to.rb +18 -0
  119. data/spec/rubylog/clause_spec.rb +81 -0
  120. data/spec/rubylog/variable_spec.rb +25 -0
  121. data/spec/rubylog_spec.rb +914 -0
  122. data/spec/spec_helper.rb +12 -0
  123. data/spec/theory_spec.rb +1 -0
  124. metadata +339 -0
@@ -0,0 +1,409 @@
1
+ # encoding: utf-8
2
+ require 'rubylog'
3
+ require 'pp'
4
+
5
+ class Range
6
+ def choose
7
+ self.begin + rand(self.end-self.begin+1)
8
+ end
9
+ end
10
+
11
+ class Array
12
+ def choose
13
+ self[(rand*size).to_i]
14
+ end
15
+ end
16
+
17
+
18
+ class << TimeTheory = Rubylog::Theory.new!
19
+ TimeTheory.predicate [:elt,2]
20
+ end
21
+
22
+ class << MechanikaTheory = Rubylog::Theory.new!
23
+ Symbol.send :include, TimeTheory.public_interface
24
+ Object.rubylog_functor \
25
+ :egy
26
+ Symbol.rubylog_functor \
27
+ :nobel_dijas,
28
+ :ember,
29
+ :modszer,
30
+ :def,
31
+ :of,
32
+ :kutatott,
33
+ :felfedezte,
34
+ :kidolgozta,
35
+ :javasolta,
36
+ :megmagyarazza,
37
+ :igazolja,
38
+ :mennyiseg,
39
+ :during,
40
+ :mertekegysege
41
+ Rubylog::Clause.rubylog_functor\
42
+ :learn,
43
+ :all_learn,
44
+ :see,
45
+ :all_see,
46
+ :during
47
+ MechanikaTheory.predicate [:fizikus,1]
48
+ MechanikaTheory.discontinuous [:def,2], [:ember,1], [:elt,2], [:modszer,1], [:of,2], [:egy,2], [:during,2], [:nobel_dijas, 3]
49
+
50
+
51
+ X.ember.if X.egy :filozofus
52
+ X.ember.if X.egy :fizikus
53
+
54
+ X.egy(:filozofus).if X.in [:Szokratesz, :Demokritosz, :Platon, :Arisztotelesz, :Arkhimedesz, :Ptolemaiosz]
55
+
56
+ :Szokratesz. elt! [-469,-399]
57
+ :Demokritosz. elt! [-460,-370]
58
+ :Platon. elt! [-427,-347]
59
+ :Arisztotelesz.elt! [-384,-322]
60
+ :Arkhimedesz. elt! [-287,-212]
61
+ :Ptolemaiosz. elt! [ 85, 161]
62
+
63
+ X.modszer.if X.in [
64
+ :megfigyeles,
65
+ :kiserlet,
66
+ :meres,
67
+ :torveny,
68
+ :elmelet,
69
+ :hipotezis,
70
+ :modell,
71
+ :korrespondancia_elv
72
+ ]
73
+
74
+ :kiserlet.def! "Kísérlet az, amikor az általunk kiválasztott esemény számára tudatosan olyan feltételeket teremtünk, hogy az megismételhető legyen különböző, általunk előírt körülmények között."
75
+
76
+ :meres.def! "Valamilyen önkényesen választott egységgel történő összehasonlítás"
77
+
78
+ :torveny.def! "Mérhető mennyiségek közti összefüggés."
79
+ :torveny.def! "A mért eredmények közti kapcsolat megfogalmazása matematikai összefüggés formájában"
80
+
81
+ :hipotezis.def! "Az elmélet kidolgozása közben tett feltételezés. Ha az elmélet következtetéseit a tapasztalat megerősíti, akkor el kell fogadni a hipotézist, különben el kell vetni"
82
+
83
+ :modell.def! "Egyszerűsítő feltevés a valóság vizsgálata során."
84
+ X.egy(:modell).if X.in [:merev_test, :tomegpont, :abszolut_rugalmas_test, :idealis_gaz]
85
+
86
+ :korrespondancia_elv.def! "A jelenségeket általánosabban leíró elmélet a speciálisabb elmélet eredményeit tartalmazza, mint határesetet."
87
+ [:relativisztikus_sebessegformula, :galilei_fele_sebessegosszegzesi_keplet].egy :korrespondancia_elv
88
+
89
+ :Leonardo_da_Vinci.ember!.elt! [1452, 1519]
90
+
91
+ :Galileo_Galilei.egy!(:fizikus).elt! [1564,1642]
92
+
93
+ :Isaac_Newton.egy!(:fizikus).elt!([1642,1727]).kutatott!(:optika)
94
+
95
+ :Albert_Einstein.egy!(:fizikus).elt!([1879,1955]).nobel_dijas!(:fizika, 1921)
96
+
97
+ :Blaise_Pascal.egy!(:fizikus).elt!([1623,1662])
98
+
99
+ :Robert_Hooke.egy!(:fizikus).elt!([1635,1703])
100
+
101
+ :Daniel_Bernoulli.egy!(:fizikus).elt!([1700,1782])
102
+
103
+ :Roger_Bacon.egy!(:filozofus).elt!([1214,1292])
104
+
105
+ :Karl_Gauss.egy!(:fizikus).egy!(:matematikus).elt!([1777,1855])
106
+
107
+
108
+
109
+ :indukcio.modszer!.of!(:kiserleti_fizika).def!("Tapasztalatgyűjtés után általánosítás útján elméletek felépítése")
110
+ :dedukcio.modszer!.of!(:elmeleti_fizika).def!("Alapelvekből levezeti a konkrét összefüggéseket, és összeveti a valósággal")
111
+
112
+ (X.egy :Kepler_torveny).all(:gravitacios_torveny.megmagyarazza(X)).egy! :deduckio
113
+ :specialis_relativitaselmelet.of!(:Einstein).megmagyarazza(:merkur_perihelium_mozgasa).egy!(:indukcio)
114
+ :altalanos_relativitaselmelet.of!(:Einstein).megmagyarazza(:fenysebesseg_keplet?.of!(:Armand_Fizeau.egy!(:fizikus).elt! [1819,1896])).egy!(:indukcio)
115
+ (:elektromagneses_hullamok_kiserleti_igazolasa.of!(:Heinrich_Hertz.egy!(:fizikus).elt!([1857,1897])).igazolja :elektromagneses_hullamok_elmelete.of!(:Maxwell)).egy!(:dedukcio)
116
+
117
+ :CERN_kutatasok.egy! :alapkutatas.modszer!
118
+
119
+ # Mérés
120
+
121
+ X.mennyiseg.if X.in [:ut, :ido, :sebesseg, :tomeg]
122
+
123
+ :SI.during! [1790,ANY]
124
+
125
+ :hosszusag.mertekegysege! :m
126
+ :m.def("A Föld Dunquerque-Barcelona délkörének 40-milliomod része.").during! [1790,1874]
127
+ :m.def("A mintaméter két vonása közötti távolság").during! [1874,1960]
128
+ :m.def("1650763.73 * a kripton 2p10 és 5d5 energiaszintjei közötti átmenet során kibocsátott fény hullámhossza").during! [1960,1983]
129
+ :Bay_Zoltan.egy!(:fizikus).elt!([1900,1992]).javasolta!( :m.def("A vákumban terjedő fénysebesség 1/299792458 s alatti útja").during! [1983,ANY] )
130
+
131
+ Symbol.rubylog_functor :per
132
+ Rubylog::Clause.rubylog_functor :per
133
+ MechanikaTheory.discontinuous [:per,3]
134
+
135
+ :km.per! :m, 1000
136
+ :dm.per! :m, 0.1
137
+ :cm.per! :m, 0.01
138
+ :mm.per! :m, 0.001
139
+ :um.per! :m, 1e-6
140
+ :nm.per! :m, 1e-9
141
+ :angstrom.per! :m, 1e-10
142
+
143
+ :inch.per! :cm, 2.54
144
+ :foot.per! :inch, 12
145
+ :yard.per! :foot, 3
146
+ :mile.per! :km, 1.61
147
+
148
+ :fenyev.per! :km, 9.4605e12
149
+ :parsec.per! :fenyev, 3.2616
150
+
151
+ :negyszogol.per! :m2, 3.6
152
+ :katasztralis_hold.per! :negyszogol, 1600
153
+
154
+ A.per(B,N).if A.per(X,N1).and X.per(B,N2).and N.is{|a,b,n,x,n1,n2|n1*n2}
155
+
156
+ Symbol.rubylog_functor :mero_eszkoz, :tavolsaga, :magassaga, :atmeroje,
157
+ :hossza, :vastagsaga, :mero_modszer, :sugara, :pontossaga
158
+ Symbol.rubylog_functor :megmerte
159
+ Rubylog::Clause.rubylog_functor :using
160
+ MechanikaTheory.discontinuous [:tavolsaga,3], [:magassaga,2], [:hossza,2],
161
+ [:vastagsaga,2], [:atmeroje,2], [:sugara,2], [:megmerte,2], [:pontossaga, 2]
162
+
163
+ X.egy(:hosszusag.mero_eszkoz).if X.in [
164
+ :merorud,
165
+ :meroszalag,
166
+ :tolomero,
167
+ :mikrometercsavar,
168
+ :szferometer,
169
+ :katetometer,
170
+ :komparator
171
+ ]
172
+ :haromszogeles.egy! :hosszusag.mero_modszer
173
+ :Bay_Zoltan.megmerte(:Fold.tavolsaga :Hold, X).using!(:radiohullamos_tavolsagmeres.egy! :hosszusag.mero_modszer).if :true
174
+
175
+ Symbol.rubylog_functor :galaxis, :csillag
176
+ MechanikaTheory.discontinuous [:csillag,1]
177
+ Numeric.rubylog_functor :m, :szogperc
178
+
179
+ :Fold.tavolsaga! :Andromeda.galaxis!, 2e22.m
180
+ :Fold.tavolsaga! :Proxima_Centauri.csillag!, 4e16.m
181
+ :Fold.tavolsaga! :Nap.csillag!, 1.5e11.m
182
+ :Fold.tavolsaga! :Hold, 3.8e8.m
183
+ :Fold.sugara! 6.4e6.m
184
+ :muhold_foldkozeli_pontja.magassaga! 2e5.m
185
+ :focipalya.hossza! 1e2.m
186
+ :zsilettpenge.vastagsaga! 1e-4.m
187
+ :sejt.atmeroje! 1e-5.m
188
+ :virus.atmeroje! 1e-7.m
189
+ :mikroaramkor_huzaljai.vastagsaga! 1e-7.m
190
+ :molekula.atmeroje 1e-9.m
191
+ :atom.atmeroje 1e-10.m
192
+ :atommag.atmeroje 1e-14.m
193
+
194
+ X.egy(:szog.mero_eszkoz).if X.in [
195
+ :egyetemes_szogmero.def!("Két egymáshoz pontosan hajló szárból álló, nóniuszos skálával ellátott készülék"),
196
+ :teodolit.def!("Függőlegesen és vízszintesen elforgatható, fonalkeresztes távcsővel ellátott készülék. Körnóniusz és nagyító.").pontossaga(1.szogperc)
197
+ ]
198
+
199
+ :ultrahangos
200
+ :interferogramos
201
+
202
+ # Idomeres
203
+ #
204
+
205
+ "Valamilyen periodikusan ismétlődő jelenség"
206
+
207
+ :nap.per! :s, 86400
208
+ :tropikus_ev.per! :nap, 365.2422
209
+ :csillagmasodperc.per(:s, K).if :tropikus_ev.per(:nap,N) & K.is{|_,n| n/(n+1)}
210
+
211
+ Symbol.rubylog_functor :hasznal
212
+ MechanikaTheory.discontinuous [:hasznal,2]
213
+
214
+ X.egy(:ido.mero_eszkoz).if X.in [
215
+ :mechanikus_ora.hasznal!(:csavarrugo),
216
+ :elektromos_ora.hasznal!(:elektromotor),
217
+ :ingaora.hasznal!(:rugo),
218
+ :regi_elektronikus_ora.hasznal!(:halozati_50Hz),
219
+ :elektronikus_ora.hasznal!(:kvarcoszcillator),
220
+ ]
221
+
222
+ :metronom.egy! :ingaora
223
+
224
+ Symbol.rubylog_functor :szarmaztatott_mennyiseg, :alapmennyiseg, :mennyiseg
225
+ MechanikaTheory.discontinuous [:mennyiseg,1]
226
+
227
+ X.szarmaztatott_mennyiseg.if X.mennyiseg.and X.alapmennyiseg.is_false
228
+ X.mennyiseg.if X.alapmennyiseg
229
+
230
+ X.alapmennyiseg.if X.in [
231
+ :hosszusag, :tomeg, :ido, :aramerosseg, :homerseklet, :anyagmennyiseg, :fenyerosseg
232
+ ]
233
+
234
+ Symbol.rubylog_functor :otta, :zeta, :exa, :peta, :tera, :giga, :mega, :kilo,
235
+ :hekto, :deka, :deci, :centi, :milli, :mikro, :nano, :piko, :femto, :atto
236
+
237
+ X.otta.per X, 1e24
238
+ X.zeta.per X, 1e21
239
+ X.exa. per X, 1e18
240
+ X.peta.per X, 1e15
241
+ X.tera.per X, 1e12
242
+ X.giga.per X, 1e9
243
+ X.mega.per X, 1e6
244
+ X.kilo.per X, 1e3
245
+ X.hekto.per X, 1e2
246
+ X.deka.per X, 1e1
247
+ X.deci.per X, 1e-1
248
+ X.centi.per X, 1e-2
249
+ X.milli.per X, 1e-3
250
+ X.mikro.per X, 1e-6
251
+ X.nano.per X, 1e-9
252
+ X.piko.per X, 1e-12
253
+ X.femto.per X, 1e-15
254
+ X.atto. per X, 1e-18
255
+
256
+
257
+
258
+
259
+ [:hl, :hPa, :dag, :dkg, :dm, :cm, :cg, :cl, :cGy, :cSv]
260
+
261
+
262
+ # Méréshibák
263
+
264
+ :parallaxishiba.def! "A leolvasás értéke függ a szemünk helyzetétől, ha a tárgy nem érintkezik a skálával."
265
+
266
+ :szisztematikus_hiba.def! "A mérőeszköz felépítéséből, környezete rá gyakorolt hatásából, használatának módjából eredő hiba."
267
+
268
+ :statisztikus_hiba.def! "Olyan kísérletekben, amelyek kimenetelében a véletlen is szerepet játszik, bizonyos eloszlású (tipikusan normál vagy logaritmikus normál eloszlású) lesz az eredmény."
269
+
270
+ Symbol.rubylog_functor :hibacsokkento_modszer
271
+
272
+ X.hibacsokkento_modszer.if X.in [
273
+ :finomabb_meroeszkoz_hasznalata,
274
+ :tukros_leolvasas,
275
+ :mereshatar_beallitasa,
276
+ :a_mennyiseg_tobbszoroset_merjuk,
277
+ :az_emberi_tenyezo_kiiktatasa,
278
+ :kiugro_ertekek_elhagyasa
279
+ ]
280
+
281
+ Numeric.rubylog_functor :pm
282
+ Rubylog::Clause.rubylog_functor :times, :gives
283
+
284
+ 100.0.pm(1.0).times(3.1415.pm(0.00005)).gives!((100 * 3.1415).pm(100*3.1415*(1.0/100.0 + 0.00005/3.1415)))
285
+
286
+
287
+ Symbol.rubylog_functor :eletkora, :idotartama, :periodusideje, :athaladasi_ideje
288
+ Numeric.rubylog_functor :s
289
+ MechanikaTheory.discontinuous [:eletkora,2], [:idotartama, 2], [:periodusideje, 2], [:athaladasi_ideje, 3]
290
+
291
+ :univerzum.eletkora! 4e17.s
292
+ :Fold.eletkora! 1.3e17.s
293
+ :emberiseg.eletkora! 1e13.s
294
+ :piramisok.eletkora! 1e11.s
295
+ :ember.eletkora! 2e9.s
296
+ :ev.per! :s, 1.2e7
297
+ :nap.per! :s, 8.64e4
298
+ :egy_meteres_fonalinga.periodusideje 2.s
299
+ :sziv.periodusideje 8e-1.s
300
+ :hang.periodusideje 1e-3.s
301
+ :hang.periodusideje 1e-4.s
302
+ :radiohullam.periodusideje 1e-6.s
303
+ :radiohullam.periodusideje 1e-9.s
304
+ :racsrezges.periodusideje 1e-13.s
305
+ :feny.periodusideje 2e-15.s
306
+ :nuklearis_utkozes.idotartama 1e-22.s
307
+ :feny.athaladasi_ideje :proton.atmeroje, 3.3e-24.s
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+ Clause.see.if(
331
+ Clause._puts &
332
+ Vars.is {|clause|clause.rubylog_variables.select{|v|
333
+ !v.assigned?}} &
334
+ (V.in Vars).all(
335
+ V._print & '?'._puts) &
336
+ proc{gets} &
337
+ (Clause &
338
+ (V.in Vars).all(V._puts) | :true)
339
+
340
+ )
341
+
342
+ Clause.learn.if(
343
+ (
344
+ Clause._puts &
345
+ Vars.is {|clause|clause.rubylog_variables.select{|v|
346
+ !v.assigned?}} &
347
+ (V.in Vars).all(
348
+ V._print & '.is '._print & V.is{eval gets} &
349
+ Clause &
350
+ "Correct"._puts
351
+ )
352
+ ) | (
353
+ "Wrong"._puts &
354
+ Clause &
355
+ Clause._p &
356
+ (ANY.in 1..10).all(:nl) &
357
+ :fail
358
+ )
359
+ )
360
+
361
+
362
+ A.all_learn(B).if(
363
+ :repeat &
364
+ A.one(B.learn.fails)
365
+ )
366
+
367
+ A.all_see(B).if(
368
+ A.all(B.see)
369
+ )
370
+
371
+
372
+ def self.ask question
373
+ p question
374
+ puts "X = ?"
375
+ gets
376
+ p(*question.to_a)
377
+ puts
378
+ end
379
+
380
+ def self.ask_something functor=nil, arity=nil, n=nil
381
+ functor ||= MechanikaTheory.database.keys.choose
382
+ arity ||= MechanikaTheory.database[functor].keys.choose
383
+ clause = MechanikaTheory.database[functor][arity].choose
384
+ return unless clause.is_a? Rubylog::Clause
385
+ head = clause[0]
386
+ solution = head.solutions.choose
387
+ n ||= (0..solution.arity-1).choose
388
+ args = solution.args.dup
389
+ args[n] = X
390
+ question = Rubylog::Clause.new functor, *args
391
+ ask question
392
+ end
393
+
394
+ while true
395
+ begin
396
+ #ask_something :elt,2,1
397
+ ask_something
398
+ rescue StandardError
399
+ end
400
+ end
401
+
402
+
403
+ #(
404
+ #X.ember.all_see X.elt [Szuletett, Meghalt]
405
+ #X.modszer.all_see X.def D
406
+ #).solve
407
+
408
+ #pp *(X.elt Y).solutions
409
+ end
data/examples/parse.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'rubylog'
2
+
3
+ class << Rubylog.theory
4
+ include Rubylog::DSL::DCG
5
+
6
+ :sentence.means :subject.and :verb.and :object
7
+ :subject .means :modifier.and :noun
8
+ :noun. means [:cat].or [:mouse].or [:polar_bear]
9
+ :modifier.means [:the]
10
+ :verb .means [:chases].or [:eats]
11
+
12
+ end
13
+
14
+
15
+
@@ -0,0 +1,20 @@
1
+ require 'rubylog'
2
+
3
+ class << AccessControlTheory = Rubylog::Theory.new
4
+ U.can_access_model(M).
5
+ if U.cannot_access_model(M).then :cut.and :fail
6
+ U.can_access_model(M).if M.is(Conversation).and {|u,m|m.users.include? u}
7
+
8
+ private
9
+
10
+ U.cannot_access_model(M).if U.banned
11
+ U.banned.if {|u| !u.active?}
12
+
13
+ end
14
+
15
+ class User
16
+ include_theory AccessControlTheory
17
+
18
+ end
19
+
20
+
data/lib/array.rb ADDED
@@ -0,0 +1,24 @@
1
+ class Array
2
+
3
+ # Unifiable methods
4
+ include Rubylog::Unifiable
5
+ def rubylog_unify other
6
+ return super{yield} unless other.instance_of? self.class
7
+ if empty?
8
+ yield if other.empty?
9
+ else
10
+ self[0].rubylog_unify other[0] do
11
+ self[1..-1].rubylog_unify other[1..-1] do
12
+ yield
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ # CompositeTerm methods
19
+ include Rubylog::CompositeTerm
20
+ def rubylog_clone &block
21
+ block[map{|t|t.rubylog_clone &block}]
22
+ end
23
+
24
+ end
data/lib/class.rb ADDED
@@ -0,0 +1,11 @@
1
+ class Class
2
+ def include_theory *theories
3
+ raise ArgumentError, "no theory given" if theories.empty?
4
+ theories.each {|t| include t.public_interface}
5
+ end
6
+
7
+ def rubylog_functor *functors
8
+ Rubylog::DSL.add_functors_to self, *functors
9
+ end
10
+
11
+ end
data/lib/method.rb ADDED
@@ -0,0 +1,4 @@
1
+ class Method
2
+ include Rubylog::ProcMethodAdditions
3
+ include Rubylog::DSL::SecondOrderFunctors
4
+ end
data/lib/object.rb ADDED
@@ -0,0 +1,5 @@
1
+ class Object
2
+ include Rubylog::Term
3
+ include Rubylog::Unifiable
4
+ include Rubylog::DSL::FirstOrderFunctors
5
+ end
data/lib/proc.rb ADDED
@@ -0,0 +1,4 @@
1
+ class Proc
2
+ include Rubylog::ProcMethodAdditions
3
+ include Rubylog::DSL::SecondOrderFunctors
4
+ end
@@ -0,0 +1,193 @@
1
+ module Rubylog
2
+ BUILTINS = Hash.new{|h,k| h[k] = {}}
3
+
4
+ class << Object.new
5
+ def singleton_method_added name
6
+ unless name == :singleton_method_added
7
+ m = method(name)
8
+ BUILTINS[name][m.arity] = m
9
+ end
10
+ end
11
+
12
+
13
+ # prolog builtins
14
+
15
+ def true
16
+ yield
17
+ end
18
+
19
+ def fail
20
+ end
21
+
22
+ def and a, b
23
+ a.prove { b.prove { yield } }
24
+ end
25
+
26
+ def cut
27
+ yield
28
+ raise Cut
29
+ end
30
+
31
+ def or a, b
32
+ a.prove { yield }
33
+ b.prove { yield }
34
+ end
35
+
36
+ def then a,b
37
+ stands = false
38
+ a.prove { stands = true ; break }
39
+ b.prove { yield } if stands
40
+ end
41
+
42
+ def is_false a
43
+ a.prove { return }
44
+ yield
45
+ end
46
+
47
+ def repeat # XXX not tested
48
+ yield while true
49
+ end
50
+
51
+ # unification
52
+
53
+ def is a,b
54
+ a = a.rubylog_resolve_function
55
+ b = b.rubylog_resolve_function
56
+ a.rubylog_unify(b) { yield }
57
+ end
58
+
59
+
60
+
61
+ def matches a,b
62
+ a = a.rubylog_resolve_function
63
+ b = b.rubylog_resolve_function
64
+ yield if b.rubylog_dereference === a.rubylog_dereference
65
+ end
66
+
67
+ def splits_to a,h,t
68
+ t = t.rubylog_dereference
69
+ if t.instance_of? Rubylog::Variable
70
+ a = a.rubylog_dereference
71
+ if a.instance_of? Rubylog::Variable
72
+ InternalHelpers.non_empty_list {|l|
73
+ t.rubylog_unify(l.drop 1) {
74
+ h.rubylog_unify(l[0]) {
75
+ a.rubylog_unify(l) {
76
+ yield
77
+ }
78
+ }
79
+ }
80
+ }
81
+ elsif a.instance_of? Array
82
+ if a.size > 0
83
+ h.rubylog_unify(a.first) { t.rubylog_unify(a.drop 1) { yield } }
84
+ end
85
+ end
86
+ elsif t.instance_of? Array
87
+ a.rubylog_unify([h]+t) { yield }
88
+ end
89
+ end
90
+
91
+ def in a,b
92
+ a = a.rubylog_resolve_function
93
+ b = b.rubylog_resolve_function.rubylog_dereference
94
+ if b.instance_of? Rubylog::Variable # XXX not tested
95
+ InternalHelpers.non_empty_list {|l|
96
+ a.rubylog_unify(l[-1]) {
97
+ b.rubylog_unify(l) {
98
+ yield
99
+ }
100
+ }
101
+ }
102
+ else
103
+ b.each do |e|
104
+ a.rubylog_unify(e) { yield }
105
+ end
106
+ end
107
+ end
108
+
109
+ def _p a
110
+ p a.rubylog_deep_dereference
111
+ yield
112
+ end
113
+
114
+ def _puts a
115
+ puts a.rubylog_deep_dereference
116
+ yield
117
+ end
118
+
119
+ def _print a
120
+ print a.rubylog_deep_dereference
121
+ yield
122
+ end
123
+
124
+ def nl
125
+ puts
126
+ yield
127
+ end
128
+
129
+ def all a,b
130
+ a.prove {
131
+ stands = false;
132
+ b.prove { stands = true; break }
133
+ return if not stands
134
+ }
135
+ yield
136
+ end
137
+
138
+ def any a,b
139
+ a.prove { b.prove { yield; return } }
140
+ end
141
+
142
+ def one a,b
143
+ stands = false
144
+ a.prove {
145
+ b.prove {
146
+ return if stands
147
+ stands = true
148
+ }
149
+ }
150
+ yield if stands
151
+ end
152
+
153
+ def none a,b
154
+ a.prove { b.prove { return } }
155
+ yield
156
+ end
157
+
158
+ def all a
159
+ a.prove { }
160
+ yield
161
+ end
162
+
163
+ def any a
164
+ a.prove { yield; return }
165
+ end
166
+
167
+ def one a
168
+ stands = false
169
+ a.prove {
170
+ return if stands
171
+ stands = true
172
+ }
173
+ yield if stands
174
+ end
175
+
176
+
177
+ end
178
+
179
+
180
+ # aliases
181
+ BUILTINS[:&][2] = BUILTINS[:and][2]
182
+ BUILTINS[:|][2] = BUILTINS[:or][2]
183
+ BUILTINS[:~][1] =
184
+ BUILTINS[:not][1] =
185
+ BUILTINS[:none][1] =
186
+ BUILTINS[:fails][1] = BUILTINS[:is_false][1]
187
+ BUILTINS[:false][0] = BUILTINS[:fail][0]
188
+
189
+ DSL.add_first_order_functor :is, :matches, :in, :_p, :_puts, :_print
190
+ DSL.add_second_order_functor :and, :or, :then, :is_false, :&, :|, :~, :not, :all, :any, :one, :none, :fails
191
+ DSL.add_functors_to Array, :splits_to
192
+
193
+ end
@@ -0,0 +1,20 @@
1
+ module Rubylog
2
+ module Callable
3
+ # should yield for each possible solution of the term
4
+ #def prove
5
+ # raise "abstract method called"
6
+ #end
7
+
8
+ def true?
9
+ Rubylog.theory.true? self
10
+ end
11
+
12
+ def solve
13
+ if block_given?
14
+ Rubylog.theory.solve(self) {|*a| yield *a}
15
+ else
16
+ Rubylog.theory.solve(self) {|*a|}
17
+ end
18
+ end
19
+ end
20
+ end