clipsruby 0.0.2

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 (346) hide show
  1. checksums.yaml +7 -0
  2. data/ext/clipsruby/agenda.c +1373 -0
  3. data/ext/clipsruby/agenda.h +169 -0
  4. data/ext/clipsruby/analysis.c +1142 -0
  5. data/ext/clipsruby/analysis.h +61 -0
  6. data/ext/clipsruby/argacces.c +526 -0
  7. data/ext/clipsruby/argacces.h +77 -0
  8. data/ext/clipsruby/bload.c +884 -0
  9. data/ext/clipsruby/bload.h +94 -0
  10. data/ext/clipsruby/bmathfun.c +557 -0
  11. data/ext/clipsruby/bmathfun.h +66 -0
  12. data/ext/clipsruby/bsave.c +634 -0
  13. data/ext/clipsruby/bsave.h +130 -0
  14. data/ext/clipsruby/classcom.c +976 -0
  15. data/ext/clipsruby/classcom.h +115 -0
  16. data/ext/clipsruby/classexm.c +1376 -0
  17. data/ext/clipsruby/classexm.h +97 -0
  18. data/ext/clipsruby/classfun.c +1392 -0
  19. data/ext/clipsruby/classfun.h +164 -0
  20. data/ext/clipsruby/classinf.c +1245 -0
  21. data/ext/clipsruby/classinf.h +94 -0
  22. data/ext/clipsruby/classini.c +843 -0
  23. data/ext/clipsruby/classini.h +75 -0
  24. data/ext/clipsruby/classpsr.c +957 -0
  25. data/ext/clipsruby/classpsr.h +73 -0
  26. data/ext/clipsruby/clips.h +133 -0
  27. data/ext/clipsruby/clipsruby.c +619 -0
  28. data/ext/clipsruby/clsltpsr.c +931 -0
  29. data/ext/clipsruby/clsltpsr.h +72 -0
  30. data/ext/clipsruby/commline.c +1217 -0
  31. data/ext/clipsruby/commline.h +131 -0
  32. data/ext/clipsruby/conscomp.c +1593 -0
  33. data/ext/clipsruby/conscomp.h +150 -0
  34. data/ext/clipsruby/constant.h +264 -0
  35. data/ext/clipsruby/constrct.c +1090 -0
  36. data/ext/clipsruby/constrct.h +216 -0
  37. data/ext/clipsruby/constrnt.c +554 -0
  38. data/ext/clipsruby/constrnt.h +132 -0
  39. data/ext/clipsruby/crstrtgy.c +1088 -0
  40. data/ext/clipsruby/crstrtgy.h +85 -0
  41. data/ext/clipsruby/cstrcbin.c +185 -0
  42. data/ext/clipsruby/cstrcbin.h +61 -0
  43. data/ext/clipsruby/cstrccmp.h +43 -0
  44. data/ext/clipsruby/cstrccom.c +1791 -0
  45. data/ext/clipsruby/cstrccom.h +115 -0
  46. data/ext/clipsruby/cstrcpsr.c +835 -0
  47. data/ext/clipsruby/cstrcpsr.h +97 -0
  48. data/ext/clipsruby/cstrnbin.c +282 -0
  49. data/ext/clipsruby/cstrnbin.h +55 -0
  50. data/ext/clipsruby/cstrnchk.c +826 -0
  51. data/ext/clipsruby/cstrnchk.h +91 -0
  52. data/ext/clipsruby/cstrncmp.c +238 -0
  53. data/ext/clipsruby/cstrncmp.h +57 -0
  54. data/ext/clipsruby/cstrnops.c +1176 -0
  55. data/ext/clipsruby/cstrnops.h +47 -0
  56. data/ext/clipsruby/cstrnpsr.c +1394 -0
  57. data/ext/clipsruby/cstrnpsr.h +88 -0
  58. data/ext/clipsruby/cstrnutl.c +564 -0
  59. data/ext/clipsruby/cstrnutl.h +54 -0
  60. data/ext/clipsruby/default.c +454 -0
  61. data/ext/clipsruby/default.h +57 -0
  62. data/ext/clipsruby/defins.c +971 -0
  63. data/ext/clipsruby/defins.h +127 -0
  64. data/ext/clipsruby/developr.c +677 -0
  65. data/ext/clipsruby/developr.h +69 -0
  66. data/ext/clipsruby/dffctbin.c +477 -0
  67. data/ext/clipsruby/dffctbin.h +76 -0
  68. data/ext/clipsruby/dffctbsc.c +308 -0
  69. data/ext/clipsruby/dffctbsc.h +72 -0
  70. data/ext/clipsruby/dffctcmp.c +297 -0
  71. data/ext/clipsruby/dffctcmp.h +44 -0
  72. data/ext/clipsruby/dffctdef.c +364 -0
  73. data/ext/clipsruby/dffctdef.h +104 -0
  74. data/ext/clipsruby/dffctpsr.c +179 -0
  75. data/ext/clipsruby/dffctpsr.h +49 -0
  76. data/ext/clipsruby/dffnxbin.c +520 -0
  77. data/ext/clipsruby/dffnxbin.h +67 -0
  78. data/ext/clipsruby/dffnxcmp.c +378 -0
  79. data/ext/clipsruby/dffnxcmp.h +54 -0
  80. data/ext/clipsruby/dffnxexe.c +241 -0
  81. data/ext/clipsruby/dffnxexe.h +58 -0
  82. data/ext/clipsruby/dffnxfun.c +1192 -0
  83. data/ext/clipsruby/dffnxfun.h +155 -0
  84. data/ext/clipsruby/dffnxpsr.c +514 -0
  85. data/ext/clipsruby/dffnxpsr.h +57 -0
  86. data/ext/clipsruby/dfinsbin.c +509 -0
  87. data/ext/clipsruby/dfinsbin.h +66 -0
  88. data/ext/clipsruby/dfinscmp.c +345 -0
  89. data/ext/clipsruby/dfinscmp.h +48 -0
  90. data/ext/clipsruby/drive.c +1191 -0
  91. data/ext/clipsruby/drive.h +65 -0
  92. data/ext/clipsruby/emathfun.c +1213 -0
  93. data/ext/clipsruby/emathfun.h +99 -0
  94. data/ext/clipsruby/engine.c +1568 -0
  95. data/ext/clipsruby/engine.h +203 -0
  96. data/ext/clipsruby/entities.h +276 -0
  97. data/ext/clipsruby/envrnbld.c +514 -0
  98. data/ext/clipsruby/envrnbld.h +40 -0
  99. data/ext/clipsruby/envrnmnt.c +257 -0
  100. data/ext/clipsruby/envrnmnt.h +112 -0
  101. data/ext/clipsruby/evaluatn.c +1736 -0
  102. data/ext/clipsruby/evaluatn.h +211 -0
  103. data/ext/clipsruby/expressn.c +494 -0
  104. data/ext/clipsruby/expressn.h +154 -0
  105. data/ext/clipsruby/exprnbin.c +538 -0
  106. data/ext/clipsruby/exprnbin.h +60 -0
  107. data/ext/clipsruby/exprnops.c +564 -0
  108. data/ext/clipsruby/exprnops.h +67 -0
  109. data/ext/clipsruby/exprnpsr.c +1112 -0
  110. data/ext/clipsruby/exprnpsr.h +98 -0
  111. data/ext/clipsruby/extconf.rb +2 -0
  112. data/ext/clipsruby/extnfunc.c +1015 -0
  113. data/ext/clipsruby/extnfunc.h +157 -0
  114. data/ext/clipsruby/factbin.c +447 -0
  115. data/ext/clipsruby/factbin.h +56 -0
  116. data/ext/clipsruby/factbld.c +1035 -0
  117. data/ext/clipsruby/factbld.h +63 -0
  118. data/ext/clipsruby/factcmp.c +386 -0
  119. data/ext/clipsruby/factcmp.h +46 -0
  120. data/ext/clipsruby/factcom.c +759 -0
  121. data/ext/clipsruby/factcom.h +80 -0
  122. data/ext/clipsruby/factfile.c +1761 -0
  123. data/ext/clipsruby/factfile.h +54 -0
  124. data/ext/clipsruby/factfun.c +682 -0
  125. data/ext/clipsruby/factfun.h +77 -0
  126. data/ext/clipsruby/factgen.c +1305 -0
  127. data/ext/clipsruby/factgen.h +229 -0
  128. data/ext/clipsruby/facthsh.c +438 -0
  129. data/ext/clipsruby/facthsh.h +81 -0
  130. data/ext/clipsruby/factlhs.c +250 -0
  131. data/ext/clipsruby/factlhs.h +54 -0
  132. data/ext/clipsruby/factmch.c +905 -0
  133. data/ext/clipsruby/factmch.h +68 -0
  134. data/ext/clipsruby/factmngr.c +3373 -0
  135. data/ext/clipsruby/factmngr.h +325 -0
  136. data/ext/clipsruby/factprt.c +498 -0
  137. data/ext/clipsruby/factprt.h +60 -0
  138. data/ext/clipsruby/factqpsr.c +796 -0
  139. data/ext/clipsruby/factqpsr.h +61 -0
  140. data/ext/clipsruby/factqury.c +1267 -0
  141. data/ext/clipsruby/factqury.h +112 -0
  142. data/ext/clipsruby/factrete.c +978 -0
  143. data/ext/clipsruby/factrete.h +70 -0
  144. data/ext/clipsruby/factrhs.c +667 -0
  145. data/ext/clipsruby/factrhs.h +55 -0
  146. data/ext/clipsruby/filecom.c +353 -0
  147. data/ext/clipsruby/filecom.h +137 -0
  148. data/ext/clipsruby/filertr.c +481 -0
  149. data/ext/clipsruby/filertr.h +94 -0
  150. data/ext/clipsruby/fileutil.c +1020 -0
  151. data/ext/clipsruby/fileutil.h +50 -0
  152. data/ext/clipsruby/generate.c +1079 -0
  153. data/ext/clipsruby/generate.h +57 -0
  154. data/ext/clipsruby/genrcbin.c +902 -0
  155. data/ext/clipsruby/genrcbin.h +69 -0
  156. data/ext/clipsruby/genrccmp.c +640 -0
  157. data/ext/clipsruby/genrccmp.h +59 -0
  158. data/ext/clipsruby/genrccom.c +2017 -0
  159. data/ext/clipsruby/genrccom.h +119 -0
  160. data/ext/clipsruby/genrcexe.c +737 -0
  161. data/ext/clipsruby/genrcexe.h +73 -0
  162. data/ext/clipsruby/genrcfun.c +890 -0
  163. data/ext/clipsruby/genrcfun.h +185 -0
  164. data/ext/clipsruby/genrcpsr.c +1618 -0
  165. data/ext/clipsruby/genrcpsr.h +80 -0
  166. data/ext/clipsruby/globlbin.c +458 -0
  167. data/ext/clipsruby/globlbin.h +71 -0
  168. data/ext/clipsruby/globlbsc.c +361 -0
  169. data/ext/clipsruby/globlbsc.h +83 -0
  170. data/ext/clipsruby/globlcmp.c +330 -0
  171. data/ext/clipsruby/globlcmp.h +52 -0
  172. data/ext/clipsruby/globlcom.c +289 -0
  173. data/ext/clipsruby/globlcom.h +63 -0
  174. data/ext/clipsruby/globldef.c +1087 -0
  175. data/ext/clipsruby/globldef.h +151 -0
  176. data/ext/clipsruby/globlpsr.c +530 -0
  177. data/ext/clipsruby/globlpsr.h +59 -0
  178. data/ext/clipsruby/immthpsr.c +431 -0
  179. data/ext/clipsruby/immthpsr.h +55 -0
  180. data/ext/clipsruby/incrrset.c +530 -0
  181. data/ext/clipsruby/incrrset.h +73 -0
  182. data/ext/clipsruby/inherpsr.c +850 -0
  183. data/ext/clipsruby/inherpsr.h +52 -0
  184. data/ext/clipsruby/inscom.c +2076 -0
  185. data/ext/clipsruby/inscom.h +182 -0
  186. data/ext/clipsruby/insfile.c +1764 -0
  187. data/ext/clipsruby/insfile.h +96 -0
  188. data/ext/clipsruby/insfun.c +1451 -0
  189. data/ext/clipsruby/insfun.h +134 -0
  190. data/ext/clipsruby/insmngr.c +2550 -0
  191. data/ext/clipsruby/insmngr.h +125 -0
  192. data/ext/clipsruby/insmoddp.c +1041 -0
  193. data/ext/clipsruby/insmoddp.h +91 -0
  194. data/ext/clipsruby/insmult.c +804 -0
  195. data/ext/clipsruby/insmult.h +62 -0
  196. data/ext/clipsruby/inspsr.c +602 -0
  197. data/ext/clipsruby/inspsr.h +60 -0
  198. data/ext/clipsruby/insquery.c +1278 -0
  199. data/ext/clipsruby/insquery.h +115 -0
  200. data/ext/clipsruby/insqypsr.c +729 -0
  201. data/ext/clipsruby/insqypsr.h +63 -0
  202. data/ext/clipsruby/iofun.c +2045 -0
  203. data/ext/clipsruby/iofun.h +116 -0
  204. data/ext/clipsruby/lgcldpnd.c +644 -0
  205. data/ext/clipsruby/lgcldpnd.h +75 -0
  206. data/ext/clipsruby/main.c +112 -0
  207. data/ext/clipsruby/match.h +142 -0
  208. data/ext/clipsruby/memalloc.c +481 -0
  209. data/ext/clipsruby/memalloc.h +197 -0
  210. data/ext/clipsruby/miscfun.c +1801 -0
  211. data/ext/clipsruby/miscfun.h +132 -0
  212. data/ext/clipsruby/modulbin.c +607 -0
  213. data/ext/clipsruby/modulbin.h +84 -0
  214. data/ext/clipsruby/modulbsc.c +347 -0
  215. data/ext/clipsruby/modulbsc.h +67 -0
  216. data/ext/clipsruby/modulcmp.c +499 -0
  217. data/ext/clipsruby/modulcmp.h +54 -0
  218. data/ext/clipsruby/moduldef.c +817 -0
  219. data/ext/clipsruby/moduldef.h +271 -0
  220. data/ext/clipsruby/modulpsr.c +1150 -0
  221. data/ext/clipsruby/modulpsr.h +69 -0
  222. data/ext/clipsruby/modulutl.c +1036 -0
  223. data/ext/clipsruby/modulutl.h +84 -0
  224. data/ext/clipsruby/msgcom.c +1221 -0
  225. data/ext/clipsruby/msgcom.h +125 -0
  226. data/ext/clipsruby/msgfun.c +1076 -0
  227. data/ext/clipsruby/msgfun.h +118 -0
  228. data/ext/clipsruby/msgpass.c +1441 -0
  229. data/ext/clipsruby/msgpass.h +103 -0
  230. data/ext/clipsruby/msgpsr.c +698 -0
  231. data/ext/clipsruby/msgpsr.h +73 -0
  232. data/ext/clipsruby/multifld.c +1404 -0
  233. data/ext/clipsruby/multifld.h +130 -0
  234. data/ext/clipsruby/multifun.c +2182 -0
  235. data/ext/clipsruby/multifun.h +102 -0
  236. data/ext/clipsruby/network.h +142 -0
  237. data/ext/clipsruby/objbin.c +1522 -0
  238. data/ext/clipsruby/objbin.h +79 -0
  239. data/ext/clipsruby/objcmp.c +1507 -0
  240. data/ext/clipsruby/objcmp.h +71 -0
  241. data/ext/clipsruby/object.h +260 -0
  242. data/ext/clipsruby/objrtbin.c +701 -0
  243. data/ext/clipsruby/objrtbin.h +79 -0
  244. data/ext/clipsruby/objrtbld.c +2393 -0
  245. data/ext/clipsruby/objrtbld.h +66 -0
  246. data/ext/clipsruby/objrtcmp.c +734 -0
  247. data/ext/clipsruby/objrtcmp.h +66 -0
  248. data/ext/clipsruby/objrtfnx.c +1330 -0
  249. data/ext/clipsruby/objrtfnx.h +222 -0
  250. data/ext/clipsruby/objrtgen.c +736 -0
  251. data/ext/clipsruby/objrtgen.h +63 -0
  252. data/ext/clipsruby/objrtmch.c +1524 -0
  253. data/ext/clipsruby/objrtmch.h +160 -0
  254. data/ext/clipsruby/parsefun.c +415 -0
  255. data/ext/clipsruby/parsefun.h +67 -0
  256. data/ext/clipsruby/pattern.c +1265 -0
  257. data/ext/clipsruby/pattern.h +163 -0
  258. data/ext/clipsruby/pprint.c +328 -0
  259. data/ext/clipsruby/pprint.h +79 -0
  260. data/ext/clipsruby/prccode.c +1478 -0
  261. data/ext/clipsruby/prccode.h +145 -0
  262. data/ext/clipsruby/prcdrfun.c +640 -0
  263. data/ext/clipsruby/prcdrfun.h +95 -0
  264. data/ext/clipsruby/prcdrpsr.c +1068 -0
  265. data/ext/clipsruby/prcdrpsr.h +79 -0
  266. data/ext/clipsruby/prdctfun.c +869 -0
  267. data/ext/clipsruby/prdctfun.h +77 -0
  268. data/ext/clipsruby/prntutil.c +878 -0
  269. data/ext/clipsruby/prntutil.h +125 -0
  270. data/ext/clipsruby/proflfun.c +827 -0
  271. data/ext/clipsruby/proflfun.h +118 -0
  272. data/ext/clipsruby/reorder.c +2082 -0
  273. data/ext/clipsruby/reorder.h +172 -0
  274. data/ext/clipsruby/reteutil.c +1732 -0
  275. data/ext/clipsruby/reteutil.h +111 -0
  276. data/ext/clipsruby/retract.c +710 -0
  277. data/ext/clipsruby/retract.h +74 -0
  278. data/ext/clipsruby/router.c +737 -0
  279. data/ext/clipsruby/router.h +147 -0
  280. data/ext/clipsruby/rulebin.c +1136 -0
  281. data/ext/clipsruby/rulebin.h +153 -0
  282. data/ext/clipsruby/rulebld.c +1328 -0
  283. data/ext/clipsruby/rulebld.h +62 -0
  284. data/ext/clipsruby/rulebsc.c +517 -0
  285. data/ext/clipsruby/rulebsc.h +91 -0
  286. data/ext/clipsruby/rulecmp.c +733 -0
  287. data/ext/clipsruby/rulecmp.h +63 -0
  288. data/ext/clipsruby/rulecom.c +1583 -0
  289. data/ext/clipsruby/rulecom.h +116 -0
  290. data/ext/clipsruby/rulecstr.c +892 -0
  291. data/ext/clipsruby/rulecstr.h +53 -0
  292. data/ext/clipsruby/ruledef.c +559 -0
  293. data/ext/clipsruby/ruledef.h +179 -0
  294. data/ext/clipsruby/ruledlt.c +599 -0
  295. data/ext/clipsruby/ruledlt.h +58 -0
  296. data/ext/clipsruby/rulelhs.c +1216 -0
  297. data/ext/clipsruby/rulelhs.h +52 -0
  298. data/ext/clipsruby/rulepsr.c +1073 -0
  299. data/ext/clipsruby/rulepsr.h +61 -0
  300. data/ext/clipsruby/scanner.c +856 -0
  301. data/ext/clipsruby/scanner.h +112 -0
  302. data/ext/clipsruby/setup.h +488 -0
  303. data/ext/clipsruby/sortfun.c +433 -0
  304. data/ext/clipsruby/sortfun.h +55 -0
  305. data/ext/clipsruby/strngfun.c +1173 -0
  306. data/ext/clipsruby/strngfun.h +96 -0
  307. data/ext/clipsruby/strngrtr.c +523 -0
  308. data/ext/clipsruby/strngrtr.h +97 -0
  309. data/ext/clipsruby/symblbin.c +648 -0
  310. data/ext/clipsruby/symblbin.h +64 -0
  311. data/ext/clipsruby/symblcmp.c +893 -0
  312. data/ext/clipsruby/symblcmp.h +61 -0
  313. data/ext/clipsruby/symbol.c +1961 -0
  314. data/ext/clipsruby/symbol.h +243 -0
  315. data/ext/clipsruby/sysdep.c +894 -0
  316. data/ext/clipsruby/sysdep.h +164 -0
  317. data/ext/clipsruby/textpro.c +1388 -0
  318. data/ext/clipsruby/textpro.h +77 -0
  319. data/ext/clipsruby/tmpltbin.c +609 -0
  320. data/ext/clipsruby/tmpltbin.h +108 -0
  321. data/ext/clipsruby/tmpltbsc.c +327 -0
  322. data/ext/clipsruby/tmpltbsc.h +87 -0
  323. data/ext/clipsruby/tmpltcmp.c +450 -0
  324. data/ext/clipsruby/tmpltcmp.h +57 -0
  325. data/ext/clipsruby/tmpltdef.c +584 -0
  326. data/ext/clipsruby/tmpltdef.h +155 -0
  327. data/ext/clipsruby/tmpltfun.c +2477 -0
  328. data/ext/clipsruby/tmpltfun.h +122 -0
  329. data/ext/clipsruby/tmpltlhs.c +379 -0
  330. data/ext/clipsruby/tmpltlhs.h +50 -0
  331. data/ext/clipsruby/tmpltpsr.c +819 -0
  332. data/ext/clipsruby/tmpltpsr.h +59 -0
  333. data/ext/clipsruby/tmpltrhs.c +595 -0
  334. data/ext/clipsruby/tmpltrhs.h +55 -0
  335. data/ext/clipsruby/tmpltutl.c +637 -0
  336. data/ext/clipsruby/tmpltutl.h +82 -0
  337. data/ext/clipsruby/userdata.c +156 -0
  338. data/ext/clipsruby/userdata.h +72 -0
  339. data/ext/clipsruby/userfunctions.c +70 -0
  340. data/ext/clipsruby/usrsetup.h +7 -0
  341. data/ext/clipsruby/utility.c +1594 -0
  342. data/ext/clipsruby/utility.h +250 -0
  343. data/ext/clipsruby/watch.c +865 -0
  344. data/ext/clipsruby/watch.h +124 -0
  345. data/lib/clipsruby.rb +1 -0
  346. metadata +388 -0
@@ -0,0 +1,53 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 07/30/16 */
5
+ /* */
6
+ /* RULE CONSTRAINTS HEADER FILE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides routines for detecting constraint */
11
+ /* conflicts in the LHS and RHS of rules. */
12
+ /* */
13
+ /* Principal Programmer(s): */
14
+ /* Gary D. Riley */
15
+ /* */
16
+ /* Contributing Programmer(s): */
17
+ /* */
18
+ /* Revision History: */
19
+ /* */
20
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
21
+ /* */
22
+ /* 6.30: Support for long long integers. */
23
+ /* */
24
+ /* 6.40: Removed LOCALE definition. */
25
+ /* */
26
+ /* Pragma once and other inclusion changes. */
27
+ /* */
28
+ /* Added support for booleans with <stdbool.h>. */
29
+ /* */
30
+ /* Removed use of void pointers for specific */
31
+ /* data structures. */
32
+ /* */
33
+ /*************************************************************/
34
+
35
+ #ifndef _H_rulecstr
36
+
37
+ #pragma once
38
+
39
+ #define _H_rulecstr
40
+
41
+ struct lhsParseNode *GetExpressionVarConstraints(Environment *,struct lhsParseNode *);
42
+ struct lhsParseNode *DeriveVariableConstraints(Environment *,struct lhsParseNode *);
43
+ bool ProcessConnectedConstraints(Environment *,struct lhsParseNode *,struct lhsParseNode *,struct lhsParseNode *);
44
+ void ConstraintReferenceErrorMessage(Environment *,
45
+ CLIPSLexeme *,
46
+ struct lhsParseNode *,
47
+ int,int,
48
+ CLIPSLexeme *,
49
+ int);
50
+ bool CheckRHSForConstraintErrors(Environment *,struct expr *,struct lhsParseNode *);
51
+
52
+ #endif /* _H_rulecstr */
53
+
@@ -0,0 +1,559 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 08/06/16 */
5
+ /* */
6
+ /* DEFRULE MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Defines basic defrule primitive functions such */
11
+ /* as allocating and deallocating, traversing, and finding */
12
+ /* defrule data structures. */
13
+ /* */
14
+ /* Principal Programmer(s): */
15
+ /* Gary D. Riley */
16
+ /* */
17
+ /* Contributing Programmer(s): */
18
+ /* Brian L. Dantes */
19
+ /* */
20
+ /* Revision History: */
21
+ /* */
22
+ /* 6.24: Removed DYNAMIC_SALIENCE and */
23
+ /* LOGICAL_DEPENDENCIES compilation flags. */
24
+ /* */
25
+ /* Removed CONFLICT_RESOLUTION_STRATEGIES */
26
+ /* compilation flag. */
27
+ /* */
28
+ /* Renamed BOOLEAN macro type to intBool. */
29
+ /* */
30
+ /* Corrected code to remove run-time program */
31
+ /* compiler warnings. */
32
+ /* */
33
+ /* 6.30: Removed conditional code for unsupported */
34
+ /* compilers/operating systems (IBM_MCW, */
35
+ /* MAC_MCW, and IBM_TBC). */
36
+ /* */
37
+ /* Added support for hashed memories. */
38
+ /* */
39
+ /* Added additional developer statistics to help */
40
+ /* analyze join network performance. */
41
+ /* */
42
+ /* Added salience groups to improve performance */
43
+ /* with large numbers of activations of different */
44
+ /* saliences. */
45
+ /* */
46
+ /* Added EnvGetDisjunctCount and */
47
+ /* EnvGetNthDisjunct functions. */
48
+ /* */
49
+ /* Added const qualifiers to remove C++ */
50
+ /* deprecation warnings. */
51
+ /* */
52
+ /* Converted API macros to function calls. */
53
+ /* */
54
+ /* Changed find construct functionality so that */
55
+ /* imported modules are search when locating a */
56
+ /* named construct. */
57
+ /* */
58
+ /* 6.40: Pragma once and other inclusion changes. */
59
+ /* */
60
+ /* Added support for booleans with <stdbool.h>. */
61
+ /* */
62
+ /* Removed use of void pointers for specific */
63
+ /* data structures. */
64
+ /* */
65
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
66
+ /* */
67
+ /*************************************************************/
68
+
69
+ #include "setup.h"
70
+
71
+ #if DEFRULE_CONSTRUCT
72
+
73
+ #include <stdio.h>
74
+
75
+ #include "agenda.h"
76
+ #include "drive.h"
77
+ #include "engine.h"
78
+ #include "envrnmnt.h"
79
+ #include "memalloc.h"
80
+ #include "pattern.h"
81
+ #include "retract.h"
82
+ #include "reteutil.h"
83
+ #include "rulebsc.h"
84
+ #include "rulecom.h"
85
+ #include "rulepsr.h"
86
+ #include "ruledlt.h"
87
+
88
+ #if BLOAD || BLOAD_AND_BSAVE || BLOAD_ONLY
89
+ #include "bload.h"
90
+ #include "rulebin.h"
91
+ #endif
92
+
93
+ #if CONSTRUCT_COMPILER && (! RUN_TIME)
94
+ #include "rulecmp.h"
95
+ #endif
96
+
97
+ #include "ruledef.h"
98
+
99
+ /***************************************/
100
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
101
+ /***************************************/
102
+
103
+ static void *AllocateModule(Environment *);
104
+ static void ReturnModule(Environment *,void *);
105
+ static void InitializeDefruleModules(Environment *);
106
+ static void DeallocateDefruleData(Environment *);
107
+ static void DestroyDefruleAction(Environment *,ConstructHeader *,void *);
108
+ #if RUN_TIME
109
+ static void AddBetaMemoriesToRule(Environment *,struct joinNode *);
110
+ #endif
111
+
112
+ /**********************************************************/
113
+ /* InitializeDefrules: Initializes the defrule construct. */
114
+ /**********************************************************/
115
+ void InitializeDefrules(
116
+ Environment *theEnv)
117
+ {
118
+ unsigned long i;
119
+ AllocateEnvironmentData(theEnv,DEFRULE_DATA,sizeof(struct defruleData),DeallocateDefruleData);
120
+
121
+ InitializeEngine(theEnv);
122
+ InitializeAgenda(theEnv);
123
+ InitializePatterns(theEnv);
124
+ InitializeDefruleModules(theEnv);
125
+
126
+ AddReservedPatternSymbol(theEnv,"and",NULL);
127
+ AddReservedPatternSymbol(theEnv,"not",NULL);
128
+ AddReservedPatternSymbol(theEnv,"or",NULL);
129
+ AddReservedPatternSymbol(theEnv,"test",NULL);
130
+ AddReservedPatternSymbol(theEnv,"logical",NULL);
131
+ AddReservedPatternSymbol(theEnv,"exists",NULL);
132
+ AddReservedPatternSymbol(theEnv,"forall",NULL);
133
+
134
+ DefruleBasicCommands(theEnv);
135
+
136
+ DefruleCommands(theEnv);
137
+
138
+ DefruleData(theEnv)->DefruleConstruct =
139
+ AddConstruct(theEnv,"defrule","defrules",
140
+ ParseDefrule,
141
+ (FindConstructFunction *) FindDefrule,
142
+ GetConstructNamePointer,GetConstructPPForm,
143
+ GetConstructModuleItem,
144
+ (GetNextConstructFunction *) GetNextDefrule,
145
+ SetNextConstruct,
146
+ (IsConstructDeletableFunction *) DefruleIsDeletable,
147
+ (DeleteConstructFunction *) Undefrule,
148
+ (FreeConstructFunction *) ReturnDefrule);
149
+
150
+ DefruleData(theEnv)->AlphaMemoryTable = (ALPHA_MEMORY_HASH **)
151
+ gm2(theEnv,sizeof (ALPHA_MEMORY_HASH *) * ALPHA_MEMORY_HASH_SIZE);
152
+
153
+ for (i = 0; i < ALPHA_MEMORY_HASH_SIZE; i++) DefruleData(theEnv)->AlphaMemoryTable[i] = NULL;
154
+
155
+ DefruleData(theEnv)->BetaMemoryResizingFlag = true;
156
+
157
+ DefruleData(theEnv)->RightPrimeJoins = NULL;
158
+ DefruleData(theEnv)->LeftPrimeJoins = NULL;
159
+ }
160
+
161
+ /**************************************************/
162
+ /* DeallocateDefruleData: Deallocates environment */
163
+ /* data for the defrule construct. */
164
+ /**************************************************/
165
+ static void DeallocateDefruleData(
166
+ Environment *theEnv)
167
+ {
168
+ struct defruleModule *theModuleItem;
169
+ Defmodule *theModule;
170
+ Activation *theActivation, *tmpActivation;
171
+ struct salienceGroup *theGroup, *tmpGroup;
172
+
173
+ #if BLOAD || BLOAD_AND_BSAVE
174
+ if (Bloaded(theEnv))
175
+ { return; }
176
+ #endif
177
+
178
+ DoForAllConstructs(theEnv,DestroyDefruleAction,
179
+ DefruleData(theEnv)->DefruleModuleIndex,false,NULL);
180
+
181
+ for (theModule = GetNextDefmodule(theEnv,NULL);
182
+ theModule != NULL;
183
+ theModule = GetNextDefmodule(theEnv,theModule))
184
+ {
185
+ theModuleItem = (struct defruleModule *)
186
+ GetModuleItem(theEnv,theModule,
187
+ DefruleData(theEnv)->DefruleModuleIndex);
188
+
189
+ theActivation = theModuleItem->agenda;
190
+ while (theActivation != NULL)
191
+ {
192
+ tmpActivation = theActivation->next;
193
+
194
+ rtn_struct(theEnv,activation,theActivation);
195
+
196
+ theActivation = tmpActivation;
197
+ }
198
+
199
+ theGroup = theModuleItem->groupings;
200
+ while (theGroup != NULL)
201
+ {
202
+ tmpGroup = theGroup->next;
203
+
204
+ rtn_struct(theEnv,salienceGroup,theGroup);
205
+
206
+ theGroup = tmpGroup;
207
+ }
208
+
209
+ #if ! RUN_TIME
210
+ rtn_struct(theEnv,defruleModule,theModuleItem);
211
+ #endif
212
+ }
213
+
214
+ rm(theEnv,DefruleData(theEnv)->AlphaMemoryTable,sizeof (ALPHA_MEMORY_HASH *) * ALPHA_MEMORY_HASH_SIZE);
215
+ }
216
+
217
+ /********************************************************/
218
+ /* DestroyDefruleAction: Action used to remove defrules */
219
+ /* as a result of DestroyEnvironment. */
220
+ /********************************************************/
221
+ static void DestroyDefruleAction(
222
+ Environment *theEnv,
223
+ ConstructHeader *theConstruct,
224
+ void *buffer)
225
+ {
226
+ #if MAC_XCD
227
+ #pragma unused(buffer)
228
+ #endif
229
+ Defrule *theDefrule = (Defrule *) theConstruct;
230
+
231
+ DestroyDefrule(theEnv,theDefrule);
232
+ }
233
+
234
+ /*****************************************************/
235
+ /* InitializeDefruleModules: Initializes the defrule */
236
+ /* construct for use with the defmodule construct. */
237
+ /*****************************************************/
238
+ static void InitializeDefruleModules(
239
+ Environment *theEnv)
240
+ {
241
+ DefruleData(theEnv)->DefruleModuleIndex = RegisterModuleItem(theEnv,"defrule",
242
+ AllocateModule,
243
+ ReturnModule,
244
+ #if BLOAD_AND_BSAVE || BLOAD || BLOAD_ONLY
245
+ BloadDefruleModuleReference,
246
+ #else
247
+ NULL,
248
+ #endif
249
+ #if CONSTRUCT_COMPILER && (! RUN_TIME)
250
+ DefruleCModuleReference,
251
+ #else
252
+ NULL,
253
+ #endif
254
+ (FindConstructFunction *) FindDefruleInModule);
255
+ }
256
+
257
+ /***********************************************/
258
+ /* AllocateModule: Allocates a defrule module. */
259
+ /***********************************************/
260
+ static void *AllocateModule(
261
+ Environment *theEnv)
262
+ {
263
+ struct defruleModule *theItem;
264
+
265
+ theItem = get_struct(theEnv,defruleModule);
266
+ theItem->agenda = NULL;
267
+ theItem->groupings = NULL;
268
+ return((void *) theItem);
269
+ }
270
+
271
+ /***********************************************/
272
+ /* ReturnModule: Deallocates a defrule module. */
273
+ /***********************************************/
274
+ static void ReturnModule(
275
+ Environment *theEnv,
276
+ void *theItem)
277
+ {
278
+ FreeConstructHeaderModule(theEnv,(struct defmoduleItemHeader *) theItem,DefruleData(theEnv)->DefruleConstruct);
279
+ rtn_struct(theEnv,defruleModule,theItem);
280
+ }
281
+
282
+ /************************************************************/
283
+ /* GetDefruleModuleItem: Returns a pointer to the defmodule */
284
+ /* item for the specified defrule or defmodule. */
285
+ /************************************************************/
286
+ struct defruleModule *GetDefruleModuleItem(
287
+ Environment *theEnv,
288
+ Defmodule *theModule)
289
+ {
290
+ return((struct defruleModule *) GetConstructModuleItemByIndex(theEnv,theModule,DefruleData(theEnv)->DefruleModuleIndex));
291
+ }
292
+
293
+ /****************************************************************/
294
+ /* FindDefrule: Searches for a defrule in the list of defrules. */
295
+ /* Returns a pointer to the defrule if found, otherwise NULL. */
296
+ /****************************************************************/
297
+ Defrule *FindDefrule(
298
+ Environment *theEnv,
299
+ const char *defruleName)
300
+ {
301
+ return (Defrule *) FindNamedConstructInModuleOrImports(theEnv,defruleName,DefruleData(theEnv)->DefruleConstruct);
302
+ }
303
+
304
+ /************************************************************************/
305
+ /* FindDefruleInModule: Searches for a defrule in the list of defrules. */
306
+ /* Returns a pointer to the defrule if found, otherwise NULL. */
307
+ /************************************************************************/
308
+ Defrule *FindDefruleInModule(
309
+ Environment *theEnv,
310
+ const char *defruleName)
311
+ {
312
+ return (Defrule *) FindNamedConstructInModule(theEnv,defruleName,DefruleData(theEnv)->DefruleConstruct);
313
+ }
314
+
315
+ /************************************************************/
316
+ /* GetNextDefrule: If passed a NULL pointer, returns the */
317
+ /* first defrule in the ListOfDefrules. Otherwise returns */
318
+ /* the next defrule following the defrule passed as an */
319
+ /* argument. */
320
+ /************************************************************/
321
+ Defrule *GetNextDefrule(
322
+ Environment *theEnv,
323
+ Defrule *defrulePtr)
324
+ {
325
+ return (Defrule *) GetNextConstructItem(theEnv,&defrulePtr->header,DefruleData(theEnv)->DefruleModuleIndex);
326
+ }
327
+
328
+ /******************************************************/
329
+ /* DefruleIsDeletable: Returns true if a particular */
330
+ /* defrule can be deleted, otherwise returns false. */
331
+ /******************************************************/
332
+ bool DefruleIsDeletable(
333
+ Defrule *theDefrule)
334
+ {
335
+ Environment *theEnv = theDefrule->header.env;
336
+
337
+ if (! ConstructsDeletable(theEnv))
338
+ { return false; }
339
+
340
+ for ( ;
341
+ theDefrule != NULL;
342
+ theDefrule = theDefrule->disjunct)
343
+ { if (theDefrule->executing) return false; }
344
+
345
+ if (EngineData(theEnv)->JoinOperationInProgress) return false;
346
+
347
+ return true;
348
+ }
349
+
350
+ /********************************************************/
351
+ /* GetDisjunctCount: Returns the number of disjuncts of */
352
+ /* a rule (permutations caused by the use of or CEs). */
353
+ /********************************************************/
354
+ long GetDisjunctCount(
355
+ Environment *theEnv,
356
+ Defrule *theDefrule)
357
+ {
358
+ long count = 0;
359
+
360
+ for ( ;
361
+ theDefrule != NULL;
362
+ theDefrule = theDefrule->disjunct)
363
+ { count++; }
364
+
365
+ return(count);
366
+ }
367
+
368
+ /*******************************************************/
369
+ /* GetNthDisjunct: Returns the nth disjunct of a rule. */
370
+ /* The disjunct indices run from 1 to N rather than */
371
+ /* 0 to N - 1. */
372
+ /*******************************************************/
373
+ Defrule *GetNthDisjunct(
374
+ Environment *theEnv,
375
+ Defrule *theDefrule,
376
+ long index)
377
+ {
378
+ long count = 0;
379
+
380
+ for ( ;
381
+ theDefrule != NULL;
382
+ theDefrule = theDefrule->disjunct)
383
+ {
384
+ count++;
385
+ if (count == index)
386
+ { return theDefrule; }
387
+ }
388
+
389
+ return NULL;
390
+ }
391
+
392
+ #if RUN_TIME
393
+
394
+ /******************************************/
395
+ /* DefruleRunTimeInitialize: Initializes */
396
+ /* defrule in a run-time module. */
397
+ /******************************************/
398
+ void DefruleRunTimeInitialize(
399
+ Environment *theEnv,
400
+ struct joinLink *rightPrime,
401
+ struct joinLink *leftPrime)
402
+ {
403
+ Defmodule *theModule;
404
+ Defrule *theRule, *theDisjunct;
405
+
406
+ DefruleData(theEnv)->RightPrimeJoins = rightPrime;
407
+ DefruleData(theEnv)->LeftPrimeJoins = leftPrime;
408
+
409
+ SaveCurrentModule(theEnv);
410
+
411
+ for (theModule = GetNextDefmodule(theEnv,NULL);
412
+ theModule != NULL;
413
+ theModule = GetNextDefmodule(theEnv,theModule))
414
+ {
415
+ SetCurrentModule(theEnv,theModule);
416
+ for (theRule = GetNextDefrule(theEnv,NULL);
417
+ theRule != NULL;
418
+ theRule = GetNextDefrule(theEnv,theRule))
419
+ {
420
+ for (theDisjunct = theRule;
421
+ theDisjunct != NULL;
422
+ theDisjunct = theDisjunct->disjunct)
423
+ {
424
+ theDisjunct->header.env = theEnv;
425
+ AddBetaMemoriesToRule(theEnv,theDisjunct->lastJoin);
426
+ }
427
+ }
428
+ }
429
+
430
+ RestoreCurrentModule(theEnv);
431
+ }
432
+
433
+
434
+ /**************************/
435
+ /* AddBetaMemoriesToRule: */
436
+ /**************************/
437
+ static void AddBetaMemoriesToRule(
438
+ Environment *theEnv,
439
+ struct joinNode *theNode)
440
+ {
441
+ AddBetaMemoriesToJoin(theEnv,theNode);
442
+
443
+ if (theNode->lastLevel != NULL)
444
+ { AddBetaMemoriesToRule(theEnv,theNode->lastLevel); }
445
+
446
+ if (theNode->joinFromTheRight)
447
+ { AddBetaMemoriesToRule(theEnv,(struct joinNode *) theNode->rightSideEntryStructure); }
448
+ }
449
+
450
+ #endif /* RUN_TIME */
451
+
452
+ #if RUN_TIME || BLOAD_ONLY || BLOAD || BLOAD_AND_BSAVE
453
+
454
+ /**************************/
455
+ /* AddBetaMemoriesToJoin: */
456
+ /**************************/
457
+ void AddBetaMemoriesToJoin(
458
+ Environment *theEnv,
459
+ struct joinNode *theNode)
460
+ {
461
+ if ((theNode->leftMemory != NULL) || (theNode->rightMemory != NULL))
462
+ { return; }
463
+
464
+ if ((! theNode->firstJoin) || theNode->patternIsExists || theNode-> patternIsNegated || theNode->joinFromTheRight)
465
+ {
466
+ if (theNode->leftHash == NULL)
467
+ {
468
+ theNode->leftMemory = get_struct(theEnv,betaMemory);
469
+ theNode->leftMemory->beta = (struct partialMatch **) genalloc(theEnv,sizeof(struct partialMatch *));
470
+ theNode->leftMemory->beta[0] = NULL;
471
+ theNode->leftMemory->size = 1;
472
+ theNode->leftMemory->count = 0;
473
+ theNode->leftMemory->last = NULL;
474
+ }
475
+ else
476
+ {
477
+ theNode->leftMemory = get_struct(theEnv,betaMemory);
478
+ theNode->leftMemory->beta = (struct partialMatch **) genalloc(theEnv,sizeof(struct partialMatch *) * INITIAL_BETA_HASH_SIZE);
479
+ memset(theNode->leftMemory->beta,0,sizeof(struct partialMatch *) * INITIAL_BETA_HASH_SIZE);
480
+ theNode->leftMemory->size = INITIAL_BETA_HASH_SIZE;
481
+ theNode->leftMemory->count = 0;
482
+ theNode->leftMemory->last = NULL;
483
+ }
484
+
485
+ if (theNode->firstJoin && (theNode->patternIsExists || theNode-> patternIsNegated || theNode->joinFromTheRight))
486
+ {
487
+ theNode->leftMemory->beta[0] = CreateEmptyPartialMatch(theEnv);
488
+ theNode->leftMemory->beta[0]->owner = theNode;
489
+ }
490
+ }
491
+ else
492
+ { theNode->leftMemory = NULL; }
493
+
494
+ if (theNode->joinFromTheRight)
495
+ {
496
+ if (theNode->leftHash == NULL)
497
+ {
498
+ theNode->rightMemory = get_struct(theEnv,betaMemory);
499
+ theNode->rightMemory->beta = (struct partialMatch **) genalloc(theEnv,sizeof(struct partialMatch *));
500
+ theNode->rightMemory->last = (struct partialMatch **) genalloc(theEnv,sizeof(struct partialMatch *));
501
+ theNode->rightMemory->beta[0] = NULL;
502
+ theNode->rightMemory->last[0] = NULL;
503
+ theNode->rightMemory->size = 1;
504
+ theNode->rightMemory->count = 0;
505
+ }
506
+ else
507
+ {
508
+ theNode->rightMemory = get_struct(theEnv,betaMemory);
509
+ theNode->rightMemory->beta = (struct partialMatch **) genalloc(theEnv,sizeof(struct partialMatch *) * INITIAL_BETA_HASH_SIZE);
510
+ theNode->rightMemory->last = (struct partialMatch **) genalloc(theEnv,sizeof(struct partialMatch *) * INITIAL_BETA_HASH_SIZE);
511
+ memset(theNode->rightMemory->beta,0,sizeof(struct partialMatch **) * INITIAL_BETA_HASH_SIZE);
512
+ memset(theNode->rightMemory->last,0,sizeof(struct partialMatch **) * INITIAL_BETA_HASH_SIZE);
513
+ theNode->rightMemory->size = INITIAL_BETA_HASH_SIZE;
514
+ theNode->rightMemory->count = 0;
515
+ }
516
+ }
517
+ else if (theNode->rightSideEntryStructure == NULL)
518
+ {
519
+ theNode->rightMemory = get_struct(theEnv,betaMemory);
520
+ theNode->rightMemory->beta = (struct partialMatch **) genalloc(theEnv,sizeof(struct partialMatch *));
521
+ theNode->rightMemory->last = (struct partialMatch **) genalloc(theEnv,sizeof(struct partialMatch *));
522
+ theNode->rightMemory->beta[0] = CreateEmptyPartialMatch(theEnv);
523
+ theNode->rightMemory->beta[0]->owner = theNode;
524
+ theNode->rightMemory->beta[0]->rhsMemory = true;
525
+ theNode->rightMemory->last[0] = theNode->rightMemory->beta[0];
526
+ theNode->rightMemory->size = 1;
527
+ theNode->rightMemory->count = 1;
528
+ }
529
+ else
530
+ { theNode->rightMemory = NULL; }
531
+ }
532
+
533
+ #endif /* RUN_TIME || BLOAD_ONLY || BLOAD || BLOAD_AND_BSAVE */
534
+
535
+ /*##################################*/
536
+ /* Additional Environment Functions */
537
+ /*##################################*/
538
+
539
+ const char *DefruleModule(
540
+ Defrule *theDefrule)
541
+ {
542
+ return GetConstructModuleName(&theDefrule->header);
543
+ }
544
+
545
+ const char *DefruleName(
546
+ Defrule *theDefrule)
547
+ {
548
+ return GetConstructNameString(&theDefrule->header);
549
+ }
550
+
551
+ const char *DefrulePPForm(
552
+ Defrule *theDefrule)
553
+ {
554
+ return GetConstructPPForm(&theDefrule->header);
555
+ }
556
+
557
+ #endif /* DEFRULE_CONSTRUCT */
558
+
559
+