Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Engine heuristic: fix for assumptions unsupported by k-induction #923

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Engine heuristic: fix for assumptions unsupported by k-induction
The k-induction engine now correctly reports unsupported assumptions, and is
then skipped by the engine selection heuristic.

Fixes #921.
  • Loading branch information
kroening committed Jan 7, 2025
commit d07c065aae7853f261fdd93fdffa94c9f18d5c51
7 changes: 4 additions & 3 deletions regression/ebmc/k-induction/k-induction6.desc
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
KNOWNBUG
CORE
k-induction6.sv

^EXIT=10$
^\[main\.a0\] always not s_eventually !main\.x: ASSUMED$
^\[main\.p0\] always main\.x: PROVED up to bound 5$
^EXIT=0$
^SIGNAL=0$
--
^warning: ignoring
--
The property should hold, but is reported as refuted.
4 changes: 2 additions & 2 deletions src/ebmc/ebmc_properties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ ebmc_propertiest ebmc_propertiest::from_transition_system(
id2string(symbol.location.get_comment());

// Don't try to prove assumption properties.
if(symbol.value.id() == ID_sva_assume)
if(properties.properties.back().is_assumption())
{
properties.properties.back().status = propertyt::statust::ASSUMED;
properties.properties.back().assumed();
properties.properties.back().normalized_expr =
normalize_property(to_sva_assume_expr(symbol.value).op());
}
Expand Down
21 changes: 19 additions & 2 deletions src/ebmc/ebmc_properties.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,11 @@ class ebmc_propertiest
return status == statust::INCONCLUSIVE;
}

void assumed()
{
status = statust::ASSUMED;
}

void unknown()
{
status = statust::UNKNOWN;
Expand Down Expand Up @@ -164,6 +169,11 @@ class ebmc_propertiest
{
return ::is_exists_path(original_expr);
}

bool is_assumption() const
{
return original_expr.id() == ID_sva_assume;
}
};

typedef std::list<propertyt> propertiest;
Expand Down Expand Up @@ -209,11 +219,18 @@ class ebmc_propertiest
return result;
}

void reset_failure_to_unknown()
/// Resets properties/assumptions in FAILURE state to
/// ASSUMED/UNKNOWN respectively.
void reset_failure()
{
for(auto &p : properties)
if(p.is_failure())
p.unknown();
{
if(p.is_assumption())
p.assumed();
else
p.unknown();
}
}
};

Expand Down
16 changes: 15 additions & 1 deletion src/ebmc/k_induction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,24 @@ Function: k_inductiont::operator()

void k_inductiont::operator()()
{
// Unsupported assumption?
bool assumption_unsupported = false;
for(auto &property : properties.properties)
{
if(!supported(property) && property.is_assumed())
{
assumption_unsupported = true;
property.failure("property unsupported by k-induction");
}
}

if(assumption_unsupported)
return; // give up

// Fail unsupported properties
for(auto &property : properties.properties)
{
if(!supported(property))
if(!supported(property) && !property.is_assumed())
property.failure("property unsupported by k-induction");
}

Expand Down
5 changes: 3 additions & 2 deletions src/ebmc/property_checker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -384,12 +384,13 @@ property_checker_resultt engine_heuristic(
k_induction(
1, transition_system, properties, solver_factory, message_handler);

properties.reset_failure_to_unknown();
properties.reset_failure();

if(!properties.has_unknown_property())
return property_checker_resultt{properties}; // done

// Now try BMC with bound 5, word-level
message.status() << "Attempting BMC with bound 5" << messaget::eom;

bmc(
5, // bound
Expand All @@ -400,7 +401,7 @@ property_checker_resultt engine_heuristic(
solver_factory,
message_handler);

properties.reset_failure_to_unknown();
properties.reset_failure();

if(!properties.has_unknown_property())
return property_checker_resultt{properties}; // done
Expand Down
Loading