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