rubylog 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +18 -0
- data/Gemfile.lock +64 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +96 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/examples/4queens.rb +10 -0
- data/examples/calculation.rb +12 -0
- data/examples/concepts.rb +46 -0
- data/examples/factorial.rb +16 -0
- data/examples/fp.rb +56 -0
- data/examples/hello.rb +9 -0
- data/examples/historia_de_espana.rb +31 -0
- data/examples/idea.rb +143 -0
- data/examples/lists.rb +5 -0
- data/examples/mechanika.rb +409 -0
- data/examples/parse.rb +15 -0
- data/examples/theory.rb +20 -0
- data/lib/array.rb +24 -0
- data/lib/class.rb +11 -0
- data/lib/method.rb +4 -0
- data/lib/object.rb +5 -0
- data/lib/proc.rb +4 -0
- data/lib/rubylog/builtins.rb +193 -0
- data/lib/rubylog/callable.rb +20 -0
- data/lib/rubylog/clause.rb +113 -0
- data/lib/rubylog/composite_term.rb +38 -0
- data/lib/rubylog/dsl/constants.rb +15 -0
- data/lib/rubylog/dsl/first_order_functors.rb +9 -0
- data/lib/rubylog/dsl/global_functors.rb +3 -0
- data/lib/rubylog/dsl/second_order_functors.rb +8 -0
- data/lib/rubylog/dsl.rb +52 -0
- data/lib/rubylog/errors.rb +18 -0
- data/lib/rubylog/internal_helpers.rb +16 -0
- data/lib/rubylog/predicate.rb +34 -0
- data/lib/rubylog/proc_method_additions.rb +69 -0
- data/lib/rubylog/term.rb +20 -0
- data/lib/rubylog/theory.rb +133 -0
- data/lib/rubylog/unifiable.rb +19 -0
- data/lib/rubylog/variable.rb +97 -0
- data/lib/rubylog.rb +39 -0
- data/lib/symbol.rb +35 -0
- data/rubylog.gemspec +187 -0
- data/script/inriasuite2spec +0 -0
- data/script/inriasuite2spec.pl +22 -0
- data/spec/bartak_guide_spec.rb +91 -0
- data/spec/inriasuite/README +122 -0
- data/spec/inriasuite/abolish +18 -0
- data/spec/inriasuite/and +9 -0
- data/spec/inriasuite/arg +32 -0
- data/spec/inriasuite/arith_diff +10 -0
- data/spec/inriasuite/arith_eq +10 -0
- data/spec/inriasuite/arith_gt +10 -0
- data/spec/inriasuite/arith_gt= +10 -0
- data/spec/inriasuite/arith_lt +10 -0
- data/spec/inriasuite/arith_lt= +10 -0
- data/spec/inriasuite/asserta +18 -0
- data/spec/inriasuite/assertz +16 -0
- data/spec/inriasuite/atom +12 -0
- data/spec/inriasuite/atom_chars +19 -0
- data/spec/inriasuite/atom_codes +15 -0
- data/spec/inriasuite/atom_concat +19 -0
- data/spec/inriasuite/atom_length +12 -0
- data/spec/inriasuite/atomic +11 -0
- data/spec/inriasuite/bagof +31 -0
- data/spec/inriasuite/call +19 -0
- data/spec/inriasuite/catch-and-throw +16 -0
- data/spec/inriasuite/char_code +13 -0
- data/spec/inriasuite/clause +16 -0
- data/spec/inriasuite/compound +12 -0
- data/spec/inriasuite/copy_term +25 -0
- data/spec/inriasuite/current_input +5 -0
- data/spec/inriasuite/current_output +5 -0
- data/spec/inriasuite/current_predicate +16 -0
- data/spec/inriasuite/current_prolog_flag +12 -0
- data/spec/inriasuite/cut +9 -0
- data/spec/inriasuite/fail +15 -0
- data/spec/inriasuite/file_manip +8 -0
- data/spec/inriasuite/findall +22 -0
- data/spec/inriasuite/float +10 -0
- data/spec/inriasuite/functor +41 -0
- data/spec/inriasuite/functor-bis +41 -0
- data/spec/inriasuite/halt +7 -0
- data/spec/inriasuite/if-then +10 -0
- data/spec/inriasuite/if-then-else +12 -0
- data/spec/inriasuite/inriasuite.obp +0 -0
- data/spec/inriasuite/inriasuite.pl +836 -0
- data/spec/inriasuite/integer +10 -0
- data/spec/inriasuite/is +11 -0
- data/spec/inriasuite/junk +0 -0
- data/spec/inriasuite/nonvar +11 -0
- data/spec/inriasuite/not_provable +12 -0
- data/spec/inriasuite/not_unify +15 -0
- data/spec/inriasuite/number +10 -0
- data/spec/inriasuite/number_chars +22 -0
- data/spec/inriasuite/number_codes +19 -0
- data/spec/inriasuite/once +11 -0
- data/spec/inriasuite/or +9 -0
- data/spec/inriasuite/repeat +5 -0
- data/spec/inriasuite/retract +10 -0
- data/spec/inriasuite/set_prolog_flag +21 -0
- data/spec/inriasuite/setof +36 -0
- data/spec/inriasuite/sub_atom +30 -0
- data/spec/inriasuite/t +1 -0
- data/spec/inriasuite/t_foo.pl +4 -0
- data/spec/inriasuite/term_diff +13 -0
- data/spec/inriasuite/term_eq +12 -0
- data/spec/inriasuite/term_gt +12 -0
- data/spec/inriasuite/term_gt= +12 -0
- data/spec/inriasuite/term_lt +12 -0
- data/spec/inriasuite/term_lt= +12 -0
- data/spec/inriasuite/true +7 -0
- data/spec/inriasuite/unify +18 -0
- data/spec/inriasuite.rb +20 -0
- data/spec/recursion_spec.rb +18 -0
- data/spec/rubylog/builtins/splits_to.rb +18 -0
- data/spec/rubylog/clause_spec.rb +81 -0
- data/spec/rubylog/variable_spec.rb +25 -0
- data/spec/rubylog_spec.rb +914 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/theory_spec.rb +1 -0
- 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
|
+
|
data/examples/theory.rb
ADDED
@@ -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
data/lib/method.rb
ADDED
data/lib/object.rb
ADDED
data/lib/proc.rb
ADDED
@@ -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
|