Warning: session_start(): open(/var/lib/php/sessions/sess_fetkdbb84cblfe8pes7k8njtcl, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
cmodule PhilosophyBot2 extends DynPrintLog {
transient L unmappedLines = ll("good", "early morning");
transient L unmappedQuestions = ll("what is the time", "how do you feel");
transient SS mappings = ciMap();
transient S program = [[
run (proc {
while (there are unmapped questions):
find (an unmapped question) x
find (an unmapped line) y
map x to y
}
) with backtracking
]];
transient new PhilosophyBot1 bot;
start-thread {
bot.program = program;
bot.addNativePredicate("there are unmapped questions",
() -> nempty(unmappedQuestions));
bot.addNativePredicate("find (an unmapped question) x",
() -> {
print("find unmapped question x");
if (empty(unmappedQuestions)) false;
Iterator it = shuffledIterator(cloneList(unmappedQuestions));
IF0 alternative = new IF0 {
public O get() {
if (!it.hasNext()) false;
ret bot.withAlternative(this, litcimap(x := it.next()));
}
};
ret alternative!;
});
bot.addNativePredicate("find (an unmapped line) z",
() -> {
print("find unmapped line z");
if (empty(unmappedLines)) false;
Iterator it = shuffledIterator(cloneList(unmappedLines));
IF0 alternative = new IF0 {
public O get() {
if (!it.hasNext()) false;
ret bot.withAlternative(this, litcimap(z := it.next()));
}
};
ret alternative!;
});
bot.addNativePredicate("map x to y",
(SS map) -> {
S x = map.get("x"), y = map.get("y");
unmappedQuestions.remove(x);
unmappedLines.remove(y);
print("Remaining unmapped questions: " + l(unmappedQuestions));
mappings.put(x, y);
print("Mapped question " + quote(x) + " to answer " + quote(y));
ret bot.withAlternative(() -> {
print("Undoing mapping of " + quote(x) + " to answer " + quote(y));
unmappedQuestions.add(x);
unmappedLines.add(y);
false;
}, true);
});
bot.onProcedureEnded.add(voidfunc(O proc, PhilosophyBot1.Path path) {
print("A procedure ended after " + nSteps(path.steps) + ": " + path);
});
bot.addNativePredicate("run x with backtracking",
(SS map) -> {
S x = map.get("x");
new PhilosophyBot1.Path path;
bot.runParsedProcedure(bot.parseProcedure(x), path);
while licensed {
if (!path.valid) ret true with print("Path not valid anymore");
print("Have " + nSteps(path.steps));
if (empty(path.steps)) ret true with print("Path is empty, nothing to backtrack");
PhilosophyBot1.Step step = last(path.steps);
print("Backtracking last step: " + step);
O result = step.alternative();
print(" Result: " + result);
if (isFalse(result)) {
print("Discarding last step as it is done");
popLast(path.steps);
}
}
true;
});
bot.run();
}
}