rubylog 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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