#include "Test/UnitTesting.hpp"
#include "Test/SyntaxSugar.hpp"
#include "Kernel/BottomUpEvaluation.hpp"
#include "Kernel/Term.hpp"
using namespace Kernel;
using namespace Inferences;
using namespace Test;
TEST_FUN(example_01__replace_all_vars_by_term) {
DECL_DEFAULT_VARS
DECL_SORT(s)
DECL_CONST(a, s)
DECL_FUNC(f, {s}, s)
DECL_FUNC(g, {s,s}, s)
TermList input = g(f(x), y);
TermList expected = g(f(a), a);
TermList result = BottomUpEvaluation<TermList, TermList>()
.function(
[&](TermList toEval, TermList* evaluatedChildren) -> TermList {
if (toEval.isVar()) {
return a;
} else {
return TermList(Term::create(toEval.term(), evaluatedChildren));
}
})
.apply(input);
ASS_EQ(result, expected)
}
TEST_FUN(example_02__compute_size) {
DECL_DEFAULT_VARS
DECL_SORT(s)
DECL_FUNC(f, {s}, s)
DECL_FUNC(g, {s,s}, s)
TermList input = g(f(x), f(f(x)));
Memo::Hashed<TermList, unsigned> memo{};
auto size = BottomUpEvaluation<TermList, unsigned>()
.function(
[&](TermList toEval, unsigned* evaluatedChildren) -> unsigned {
if (toEval.isVar()) {
return 1;
} else {
unsigned arity = toEval.term()->numTermArguments();
ASS(arity == 0 || evaluatedChildren);
unsigned out = 1;
for (unsigned i = 0; i < arity; i++) {
out += evaluatedChildren[i];
}
return out;
}
})
.memo<decltype(memo)&>(memo)
.apply(input);
ASS_EQ(size, 6)
}
TEST_FUN(example_03__compute_size_with_context) {
DECL_DEFAULT_VARS
DECL_SORT(s)
DECL_POLY_FUNC(f, 1, {s}, s)
TypedTermList input = f(s, x);
auto evalSize =
[](bool skipTypeArgs) {
return [skipTypeArgs](TypedTermList toEval, unsigned* evaluatedChildren) -> unsigned {
if (toEval.isVar()) {
return 1;
} else {
unsigned arity = skipTypeArgs ? toEval.term()->numTermArguments()
: toEval.term()->arity();
ASS(arity == 0 || evaluatedChildren);
unsigned out = 1;
for (unsigned i = 0; i < arity; i++) {
out += evaluatedChildren[i];
}
return out;
}
};
};
auto sizeWithTypeArgs = BottomUpEvaluation<TypedTermList, unsigned>()
.function(evalSize(false))
.context(TermListContext {.ignoreTypeArgs = false})
.apply(input);
auto sizeWithoutTypeArgs = BottomUpEvaluation<TypedTermList, unsigned>()
.function(evalSize(true))
.context(TermListContext {.ignoreTypeArgs = true})
.apply(input);
auto sizeWithoutTypeArgs2 = BottomUpEvaluation<TypedTermList, unsigned>()
.function(evalSize(true))
.apply(input);
ASS_EQ(sizeWithTypeArgs, 3)
ASS_EQ(sizeWithoutTypeArgs, 2)
ASS_EQ(sizeWithoutTypeArgs, sizeWithoutTypeArgs2)
}