static class LogicEngine implements IEngine {
Lisp code;
new L<Lisp> memory;
new L<S> log;
new L<Lisp> stm;
boolean fireOneRuleOnly = true;
*() {}
*(Lisp *code, L<Lisp> *memory) {}
*(S codeText, L<Lisp> *memory) {
code = snlToTree(codeText);
}
void stmAdd(Lisp statement) {
stm.add(statement);
}
Lisp snlMatchFirst(Lisp pat, L<Lisp> list, SNLMatches m) {
for (Lisp l : list)
if (snlMatch2(pat, l, m))
ret l;
ret null;
}
Lisp scanMem(Lisp pat, SNLMatches m) {
ret snlMatchFirst(pat, memory, m);
}
Lisp scanMem(S pat, SNLMatches m) {
ret snlMatchFirst(snlToTree_cached(pat), memory, m);
}
public void memorize(Lisp l) {
if (!memory.contains(l)) {
memory.add(l);
saveMemory();
}
}
public void forget(Lisp pat) {
int l = l(memory);
for (int i = 0; i < l(memory); i++)
if (snlMatch(pat, memory.get(i), new HashMap))
memory.remove(i--);
if (l(memory) != l)
saveMemory();
}
void saveMemory() {} // override this for persistence
public boolean yo(Lisp snl, SNLMatches m) {
if (scanMem(snl, m) != null)
ret true;
if (snlMatch2("i < don't < know < X", snl, m))
ret scanMem("* < said < X < is < *", m) == null; // TODO: vars probably don't work
ret false;
}
boolean runSingle(Lisp code, L<Lisp> out) {
log.add("runSingle " + code);
LThread thread = new LThread(this, code);
thread.log = log;
thread.statements.addAll(stm);
//print("Statements: " + structure(thread.statements));
boolean success = thread.run();
out.addAll(thread.output);
ret success;
}
// run multiple rules
boolean runMulti(Lisp code, L<Lisp> out) {
assertTrue(isJuxta(code));
boolean success = false;
for (Lisp sub : code) {
if (runSingle(sub, out)) { // success
success = true;
if (fireOneRuleOnly)
break;
}
}
ret success;
}
L<Lisp> run() {
new L<Lisp> out;
if (isJuxta(code))
runMulti(code, out);
else
runSingle(code, out);
ret out;
}
}
!include #1002752 // newest LThread
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1002759 |
| Snippet name: | class LogicEngine (LIVE!) |
| Eternal ID of this version: | #1002759/1 |
| Text MD5: | 8ceae4f0c4fae0ecc3794ddf6ec30a8a |
| Author: | stefan |
| Category: | javax |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2016-02-20 21:44:36 |
| Source code size: | 2268 bytes / 97 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 1165 / 1315 |
| Referenced in: | #1002761 - SNL Logic Engine 5, factored out LogicEngine #3000382 - Answer for ferdie (>> t = 1, f = 0) #3000383 - Answer for funkoverflow (>> t=1, f=0 okay) |