// libsemigroups - C++ library for semigroups and monoids
// Copyright (C) 2020 James D. Mitchell
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/ >.
//
// This file is the fourth of six that contains tests for the KnuthBendix
// classes. In a mostly vain attempt to speed up compilation the tests are
// split across 6 files as follows:
//
// 1: contains quick tests for fpsemigroup::KnuthBendix created from rules and
// all commented out tests.
//
// 2: contains more quick tests for fpsemigroup::KnuthBendix created from rules
//
// 3: contains yet more quick tests for fpsemigroup::KnuthBendix created from
// rules
//
// 4: contains standard and extreme test for fpsemigroup::KnuthBendix created
// from rules
//
// 5: contains tests for fpsemigroup::KnuthBendix created from FroidurePin
// instances
//
// 6: contains tests for congruence::KnuthBendix.
#define CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS
#include <iostream>
#include <string>
// for string
#include <vector>
// for vector
#include "catch.hpp" // for REQUIRE, REQUIRE_NOTHROW, REQUIRE_THROWS_AS
#include "test-main.hpp" // for LIBSEMIGROUPS_TEST_CASE
#include "libsemigroups/constants.hpp" // for POSITIVE_INFINITY
#include "libsemigroups/knuth-bendix.hpp" // for KnuthBendix, operator<<
#include "libsemigroups/report.hpp" // for ReportGuard
#include "libsemigroups/siso.hpp" // for XXX
#include "libsemigroups/stl.hpp" // for XXX
#include "libsemigroups/string.hpp" // for random_string
namespace libsemigroups {
constexpr
bool REPORT =
false ;
using rule_type = fpsemigroup::KnuthBendix::rule_type;
namespace fpsemigroup {
////////////////////////////////////////////////////////////////////////
// Standard tests
////////////////////////////////////////////////////////////////////////
// Takes approx. 2s
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"084" ,
"(fpsemi) Example 6.6 in Sims (with limited "
"overlap lengths)" ,
"[standard][knuth-bendix][fpsemigroup][fpsemi]" ) {
auto rg = ReportGuard(REPORT);
KnuthBendix kb;
kb.set_alphabet(
"abc" );
kb.add_rule(
"aa" ,
"" );
kb.add_rule(
"bc" ,
"" );
kb.add_rule(
"bbb" ,
"" );
kb.add_rule(
"ababababababab" ,
"" );
kb.add_rule(
"abacabacabacabacabacabacabacabac" ,
"" );
REQUIRE(!kb.confluent());
// In Sims it says to use 44 here, but that doesn't seem to work.
kb.max_overlap(45);
// Avoid checking confluence since this is very slow, essentially takes
// the same amount of time as running Knuth-Bendix (fpsemi) 13.
kb.check_confluence_interval(LIMIT_MAX);
kb.run();
REQUIRE(kb.number_of_active_rules() == 1026);
// REQUIRE(kb.confluent());
// REQUIRE(kb.size() == 10752);
}
// Takes approx. 2s
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"085" ,
"(from kbmag/standalone/kb_data/funny3)" ,
"[standard][knuth-bendix][kbmag][shortlex]" ) {
auto rg = ReportGuard(REPORT);
KnuthBendix kb;
kb.set_alphabet(
"aAbBcC" );
kb.set_identity(
"" );
kb.set_inverses(
"AaBbCc" );
kb.add_rule(
"aaa" ,
"" );
kb.add_rule(
"bbb" ,
"" );
kb.add_rule(
"ccc" ,
"" );
kb.add_rule(
"ABa" ,
"BaB" );
kb.add_rule(
"bcB" ,
"cBc" );
kb.add_rule(
"caC" ,
"aCa" );
kb.add_rule(
"abcABCabcABCabcABC" ,
"" );
kb.add_rule(
"BcabCABcabCABcabCA" ,
"" );
kb.add_rule(
"cbACBacbACBacbACBa" ,
"" );
REQUIRE(!kb.confluent());
kb.knuth_bendix_by_overlap_length();
// kb.run() // also works, but is slower
REQUIRE(kb.confluent());
REQUIRE(kb.number_of_active_rules() == 8);
REQUIRE(kb.size() == 3);
REQUIRE(
std::vector<std::string>(kb.cbegin_normal_forms(0, POSITIVE_INFINITY),
kb.cend_normal_forms())
== std::vector<std::string>({
"" ,
"a" ,
"A" }));
}
////////////////////////////////////////////////////////////////////////
// Extreme tests
////////////////////////////////////////////////////////////////////////
// Fibonacci group F(2,7) - order 29 - works better with largish tidyint
// Takes approx. 50s
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"086" ,
"(fpsemi) (from kbmag/standalone/kb_data/f27) (finite) (2 / 2)" ,
"[extreme][knuth-bendix][fpsemigroup][fpsemi][kbmag][shortlex]" ) {
auto rg = ReportGuard(
true );
KnuthBendix kb;
kb.set_alphabet(
"aAbBcCdDyYfFgG" );
kb.set_identity(
"" );
kb.set_inverses(
"AaBbCcDdYyFfGg" );
kb.add_rule(
"ab" ,
"c" );
kb.add_rule(
"bc" ,
"d" );
kb.add_rule(
"cd" ,
"y" );
kb.add_rule(
"dy" ,
"f" );
kb.add_rule(
"yf" ,
"g" );
kb.add_rule(
"fg" ,
"a" );
kb.add_rule(
"ga" ,
"b" );
REQUIRE(!kb.confluent());
kb.knuth_bendix_by_overlap_length();
REQUIRE(kb.confluent());
REQUIRE(kb.number_of_active_rules() == 194);
REQUIRE(kb.size() == 29);
}
// Mathieu group M_11
// Takes approx. 2m9s (majority in checking confluence)
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"087" ,
"(from kbmag/standalone/kb_data/m11)" ,
"[extreme][knuth-bendix][kbmag][shortlex]" ) {
auto rg = ReportGuard(
true );
KnuthBendix kb;
kb.set_alphabet(
"abB" );
kb.set_identity(
"" );
kb.set_inverses(
"aBb" );
kb.add_rule(
"BB" ,
"bb" );
kb.add_rule(
"BaBaBaBaBaB" ,
"abababababa" );
kb.add_rule(
"bbabbabba" ,
"abbabbabb" );
kb.add_rule(
"aBaBababaBabaBBaBab" ,
"" );
REQUIRE(!kb.confluent());
kb.knuth_bendix_by_overlap_length();
REQUIRE(kb.confluent());
REQUIRE(kb.number_of_active_rules() == 1731);
REQUIRE(kb.size() == 7920);
}
// Weyl group E8 (all gens involutory).
// Takes approx. 8s for KnuthBendix
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"088" ,
"(from kbmag/standalone/kb_data/e8)" ,
"[extreme][knuth-bendix][kbmag][shortlex]" ) {
auto rg = ReportGuard(
true );
KnuthBendix kb;
kb.set_alphabet(
"abcdefgh" );
kb.set_identity(
"" );
kb.set_inverses(
"abcdefgh" );
kb.add_rule(
"bab" ,
"aba" );
kb.add_rule(
"ca" ,
"ac" );
kb.add_rule(
"da" ,
"ad" );
kb.add_rule(
"ea" ,
"ae" );
kb.add_rule(
"fa" ,
"af" );
kb.add_rule(
"ga" ,
"ag" );
kb.add_rule(
"ha" ,
"ah" );
kb.add_rule(
"cbc" ,
"bcb" );
kb.add_rule(
"db" ,
"bd" );
kb.add_rule(
"eb" ,
"be" );
kb.add_rule(
"fb" ,
"bf" );
kb.add_rule(
"gb" ,
"bg" );
kb.add_rule(
"hb" ,
"bh" );
kb.add_rule(
"dcd" ,
"cdc" );
kb.add_rule(
"ece" ,
"cec" );
kb.add_rule(
"fc" ,
"cf" );
kb.add_rule(
"gc" ,
"cg" );
kb.add_rule(
"hc" ,
"ch" );
kb.add_rule(
"ed" ,
"de" );
kb.add_rule(
"fd" ,
"df" );
kb.add_rule(
"gd" ,
"dg" );
kb.add_rule(
"hd" ,
"dh" );
kb.add_rule(
"fef" ,
"efe" );
kb.add_rule(
"ge" ,
"eg" );
kb.add_rule(
"he" ,
"eh" );
kb.add_rule(
"gfg" ,
"fgf" );
kb.add_rule(
"hf" ,
"fh" );
kb.add_rule(
"hgh" ,
"ghg" );
REQUIRE(!kb.confluent());
kb.knuth_bendix_by_overlap_length();
REQUIRE(kb.confluent());
REQUIRE(kb.number_of_active_rules() == 192);
REQUIRE(kb.gilman_digraph().number_of_nodes() == 332);
REQUIRE(kb.gilman_digraph().number_of_edges() == 533);
REQUIRE(kb.size() == 696729600);
}
// Second of BHN's series of increasingly complicated presentations of 1.
// Works quickest with large value of tidyint
// Takes > 1m (knuth_bendix), didn't run to the end
// Takes approx. 9s (knuth_bendix_by_overlap_length)
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"089" ,
"(from kbmag/standalone/kb_data/degen4b)" ,
"[extreme][knuth-bendix][kbmag][shortlex]" ) {
auto rg = ReportGuard(
true );
KnuthBendix kb;
kb.set_alphabet(
"aAbBcC" );
kb.set_identity(
"" );
kb.set_inverses(
"AaBbCc" );
kb.add_rule(
"bbABaBcbCCAbaBBccBCbccBCb" ,
"" );
kb.add_rule(
"ccBCbCacAABcbCCaaCAcaaCAc" ,
"" );
kb.add_rule(
"aaCAcAbaBBCacAAbbABabbABa" ,
"" );
REQUIRE(!kb.confluent());
// kb.run();
kb.knuth_bendix_by_overlap_length();
REQUIRE(kb.confluent());
REQUIRE(kb.number_of_active_rules() == 6);
REQUIRE(kb.size() == 1);
}
// Two generator presentation of Fibonacci group F(2,7) - order 29. Large
// value of tidyint works better.
// Takes approx. 12s (knuth_bendix_by_overlap_length)
// Takes > 19s (knuth_bendix), didn't run to the end
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"090" ,
"(from kbmag/standalone/kb_data/f27_2gen)" ,
"[extreme][knuth-bendix][kbmag][shortlex]" ) {
auto rg = ReportGuard(
true );
KnuthBendix kb;
kb.set_alphabet(
"aAbB" );
kb.set_identity(
"" );
kb.set_inverses(
"AaBb" );
kb.add_rule(
"bababbababbabbababbab" ,
"a" );
kb.add_rule(
"abbabbababbaba" ,
"b" );
REQUIRE(!kb.confluent());
kb.knuth_bendix_by_overlap_length();
REQUIRE(kb.confluent());
REQUIRE(kb.number_of_active_rules() == 19);
REQUIRE(kb.size() == 29);
}
// Takes approx. 1m8s
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"091" ,
"(fpsemi) Example 6.6 in Sims" ,
"[extreme][knuth-bendix][fpsemigroup][fpsemi]" ) {
auto rg = ReportGuard(
true );
KnuthBendix kb;
kb.set_alphabet(
"abc" );
kb.add_rule(
"aa" ,
"" );
kb.add_rule(
"bc" ,
"" );
kb.add_rule(
"bbb" ,
"" );
kb.add_rule(
"ababababababab" ,
"" );
kb.add_rule(
"abacabacabacabacabacabacabacabac" ,
"" );
REQUIRE(!kb.confluent());
kb.knuth_bendix_by_overlap_length();
REQUIRE(kb.number_of_active_rules() == 1026);
REQUIRE(kb.confluent());
REQUIRE(kb.size() == 10752);
}
// Fibonacci group F(2,7) - without inverses
// Takes approx. 13s
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"092" ,
"(fpsemi) (from kbmag/standalone/kb_data/f27) (infinite) (1 / 2)" ,
"[extreme][knuth-bendix][fpsemigroup][fpsemi][kbmag][shortlex]" ) {
auto rg = ReportGuard(
true );
KnuthBendix kb;
kb.set_alphabet(
"aAbBcCdDyYfFgG" );
kb.add_rule(
"ab" ,
"c" );
kb.add_rule(
"bc" ,
"d" );
kb.add_rule(
"cd" ,
"y" );
kb.add_rule(
"dy" ,
"f" );
kb.add_rule(
"yf" ,
"g" );
kb.add_rule(
"fg" ,
"a" );
kb.add_rule(
"ga" ,
"b" );
REQUIRE(!kb.confluent());
kb.knuth_bendix_by_overlap_length();
// Fails to terminate, or is very slow, with knuth_bendix
REQUIRE(kb.confluent());
REQUIRE(kb.number_of_active_rules() == 47);
REQUIRE(kb.size() == POSITIVE_INFINITY);
}
// An extension of 2^6 be L32
// Takes approx. 1m7s
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"093" ,
"(fpsemi) (from kbmag/standalone/kb_data/l32ext)" ,
"[extreme][knuth-bendix][fpsemigroup][fpsemi][kbmag][shortlex]" ) {
auto rg = ReportGuard(
true );
KnuthBendix kb;
kb.set_alphabet(
"abB" );
kb.set_identity(
"" );
kb.set_inverses(
"aBb" );
kb.add_rule(
"aa" ,
"" );
kb.add_rule(
"BB" ,
"b" );
kb.add_rule(
"BaBaBaB" ,
"abababa" );
kb.add_rule(
"aBabaBabaBabaBab" ,
"BabaBabaBabaBaba" );
REQUIRE(!kb.confluent());
kb.knuth_bendix_by_overlap_length();
REQUIRE(kb.confluent());
REQUIRE(kb.number_of_active_rules() == 1026);
REQUIRE(kb.size() == 10752);
auto & ad = kb.gilman_digraph();
REQUIRE(ad.number_of_nodes() == 6021);
REQUIRE(ad.number_of_edges() == 7435);
REQUIRE(action_digraph_helper::is_acyclic(ad));
REQUIRE(ad.number_of_paths(0, 0, 100) == 10752);
}
////////////////////////////////////////////////////////////////////////
// Tests that fail
////////////////////////////////////////////////////////////////////////
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"094" ,
"Ceitin's undecidable word problem example" ,
"[fail][knuth-bendix]" ) {
auto rg = ReportGuard(
true );
KnuthBendix kb;
kb.set_alphabet(
"abcde" );
kb.add_rule(
"ac" ,
"ca" );
kb.add_rule(
"ad" ,
"da" );
kb.add_rule(
"bc" ,
"cb" );
kb.add_rule(
"bd" ,
"db" );
kb.add_rule(
"eca" ,
"ce" );
kb.add_rule(
"edb" ,
"de" );
kb.add_rule(
"cca" ,
"ccae" );
kb.run();
// I guess this shouldn't work, and indeed it doesn't!
}
// kbmag/standalone/kb_data/verifynilp
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"095" ,
"(KnuthBendix 050 again) (from kbmag/standalone/kb_data/verifynilp)" ,
"[fail][knuth-bendix][kbmag][shortlex]" ) {
auto rg = ReportGuard();
std::string lphbt =
"hHgGfFyYdDcCbBaA" ;
std::string invrs =
"HhGgFfYyDdCcBbAa" ;
std::vector<size_t> perm(lphbt.size(), 0);
std::iota(perm.begin(), perm.end(), 0);
do {
detail::apply_permutation(lphbt, invrs, perm);
// std::cout << "Alphabet is " << lphbt << std::endl;
// std::cout << std::string(72, '#') << std::endl;
KnuthBendix kb;
kb.set_alphabet(lphbt);
kb.set_identity(
"" );
kb.set_inverses(invrs);
kb.add_rule(
"BAba" ,
"c" );
kb.add_rule(
"CAca" ,
"d" );
kb.add_rule(
"DAda" ,
"y" );
kb.add_rule(
"YByb" ,
"f" );
kb.add_rule(
"FAfa" ,
"g" );
kb.add_rule(
"ga" ,
"ag" );
kb.add_rule(
"GBgb" ,
"h" );
kb.add_rule(
"cb" ,
"bc" );
kb.add_rule(
"ya" ,
"ay" );
REQUIRE(!kb.confluent());
kb.knuth_bendix_by_overlap_length();
if (kb.confluent()) {
REQUIRE(kb.number_of_active_rules() == 0);
REQUIRE(kb.size() == 0);
break ;
}
}
while (std::next_permutation(perm.begin(), perm.end()));
}
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"096" ,
"Sorouhesh" ,
"[quick][knuth-bendix][kbmag][shortlex]" ) {
auto rg = ReportGuard(REPORT);
size_t
const n = 2;
size_t
const p = 11;
KnuthBendix kb;
kb.set_alphabet(
"ab" );
kb.add_rule(std::string(size_t(std::pow(5, n)),
'a' ),
"a" );
kb.add_rule(
"aba" ,
"b" );
kb.add_rule(
"ab" , std::string(p,
'b' ) +
"a" );
REQUIRE(!kb.confluent());
kb.run();
REQUIRE(kb.number_of_active_rules() == 7);
REQUIRE(kb.size() == size_t(std::pow(5, n)) + 4 * p - 5);
REQUIRE(kb.normal_form(
"aabb" ) ==
"aabb" );
REQUIRE(kb.normal_form(
"aabbaabb" ) ==
"bbbb" );
REQUIRE(kb.normal_form(
"aabbaabbaabb" ) ==
"aabbbbbb" );
REQUIRE(kb.normal_form(
"aabbaabbaabbaabb" ) ==
"bbbbbbbb" );
REQUIRE(kb.normal_form(
"aabbaabbaabbaabbaabb" ) ==
"aabbbbbbbbbb" );
REQUIRE(
std::vector<std::string>(kb.cbegin_normal_forms(0, POSITIVE_INFINITY),
kb.cend_normal_forms())
== std::vector<std::string>({
"a" ,
"b" ,
"aa" ,
"ab" ,
"ba" ,
"bb" ,
"aaa" ,
"aab" ,
"abb" ,
"bab" ,
"bbb" ,
"aaaa" ,
"aabb" ,
"abbb" ,
"babb" ,
"bbbb" ,
"aaaaa" ,
"aabbb" ,
"abbbb" ,
"babbb" ,
"bbbbb" ,
"aaaaaa" ,
"aabbbb" ,
"abbbbb" ,
"babbbb" ,
"bbbbbb" ,
"aaaaaaa" ,
"aabbbbb" ,
"abbbbbb" ,
"babbbbb" ,
"bbbbbbb" ,
"aaaaaaaa" ,
"aabbbbbb" ,
"abbbbbbb" ,
"babbbbbb" ,
"bbbbbbbb" ,
"aaaaaaaaa" ,
"aabbbbbbb" ,
"abbbbbbbb" ,
"babbbbbbb" ,
"bbbbbbbbb" ,
"aaaaaaaaaa" ,
"aabbbbbbbb" ,
"abbbbbbbbb" ,
"babbbbbbbb" ,
"bbbbbbbbbb" ,
"aaaaaaaaaaa" ,
"aabbbbbbbbb" ,
"abbbbbbbbbb" ,
"babbbbbbbbb" ,
"aaaaaaaaaaaa" ,
"aabbbbbbbbbb" ,
"aaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaa" ,
"aaaaaaaaaaaaaaaaaaaaaaaa" }));
}
namespace {
std::string swap_a_and_b(std::string
const & w) {
std::string result;
for (
auto l : w) {
if (l ==
'a' ) {
result +=
"b" ;
}
else {
result +=
"a" ;
}
}
return result;
}
std::unordered_set<std::string>& get_set() {
static std::unordered_set<std::string> set;
return set;
}
template <
typename T>
void register_relation(T
const & it1, T
const & it2, size_t& nr) {
auto tmp = *it1 +
"#" + *it2;
auto u = swap_a_and_b(*it1);
auto v = swap_a_and_b(*it2);
if (shortlex_compare(u, v)) {
get_set().insert(u +
"#" + v);
}
else {
get_set().insert(v +
"#" + u);
}
std::cout << *it1 <<
" = " << *it2 << std::endl;
nr++;
}
}
// namespace
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"015" ,
"(fpsemi) all 2-generated 1-relation semigroups 1 to 10" ,
"[extreme][kambites][fpsemigroup][fpsemi][xxx]" ) {
auto rg = ReportGuard(
false );
auto first
= cbegin_sislo(
"ab" , std::string(1,
'a' ), std::string(11,
'a' ));
auto last = cbegin_sislo(
"ab" , std::string(1,
'a' ), std::string(11,
'a' ));
size_t N = std::distance(
first, cend_sislo(
"ab" , std::string(1,
'a' ), std::string(11,
'a' )));
REQUIRE(N == 2046);
std::advance(last, N - 1);
size_t total_c4 = 0;
size_t total = 0;
auto llast = last;
++llast;
for (
auto it1 = first; it1 != last; ++it1) {
auto it2 = it1;
++it2;
for (; it2 != llast; ++it2) {
auto tmp = *it1 +
"#" + *it2;
if (get_set().insert(tmp).second) {
bool try_again =
false ;
{
KnuthBendix k;
k.set_alphabet(
"ab" );
k.add_rule(*it1, *it2);
k.run_for(std::chrono::milliseconds(10));
if (k.confluent()) {
register_relation(it1, it2, total_c4);
}
else {
try_again =
true ;
}
}
if (try_again) {
KnuthBendix k;
k.set_alphabet(
"ba" );
k.add_rule(*it1, *it2);
k.run_for(std::chrono::milliseconds(10));
if (k.confluent()) {
register_relation(it1, it2, total_c4);
}
}
}
}
}
REQUIRE(total_c4 == 471479);
REQUIRE(total == 2092035);
}
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"016" ,
"(fpsemi) hard 2-generated 1-relation semigroups 1 to 10" ,
"[extreme][kambites][fpsemigroup][fpsemi][xxx2]" ) {
KnuthBendix k;
k.set_alphabet(
"bac" );
k.add_rule(
"a" ,
"cc" );
k.add_rule(
"c" ,
"bab" );
k.knuth_bendix_by_overlap_length();
std::cout << k.active_rules() << std::endl;
REQUIRE(k.active_rules()[0] == rule_type({
"" ,
"" }));
}
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"017" ,
"(fpsemi) Konovalov" ,
"[extreme][knuthbendix][fpsemigroup][fpsemi][xxx3]" ) {
KnuthBendix k;
k.set_alphabet(
"abAB" );
k.add_rule(
"Abba" ,
"BB" );
k.add_rule(
"Baab" ,
"AA" );
k.run();
REQUIRE(k.size() == POSITIVE_INFINITY);
}
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"018" ,
"(fpsemi) https://math.stackexchange.com/questions/2649807 ",
"[knuthbendix][fpsemigroup][fpsemi][fail]" ) {
do {
std::string lphbt =
"abcABC" ;
std::string invrs =
"ABCabc" ;
std::cout << std::string(72,
'#' ) << std::endl;
KnuthBendix k;
k.set_alphabet(lphbt);
k.set_identity(
"" );
k.set_inverses(invrs);
k.add_rule(
"aa" ,
"" );
k.add_rule(
"bbbbbbbbbbb" ,
"" );
k.add_rule(
"cc" ,
"" );
k.add_rule(
"abababab" ,
"" );
k.add_rule(
"abbabbabbabbabbabb" ,
"" );
k.add_rule(
"abbabaBabaBBabbaB" ,
"" );
k.add_rule(
"acacac" ,
"" );
k.add_rule(
"bcbc" ,
"" );
for (size_t i = 1; i < 3; ++i) {
auto lhs = detail::random_string(lphbt, 100);
auto rhs = detail::random_string(lphbt, 100);
k.add_rule(lhs, rhs);
std::cout <<
"trying rule " << lhs <<
" -> " << rhs << std::endl;
}
k.run_for(std::chrono::seconds(1));
if (k.confluent()) {
size_t
const N = k.size();
std::cout <<
"k.size() == " << N << std::endl;
if (k.size() == POSITIVE_INFINITY) {
break ;
}
}
}
while (
true );
}
LIBSEMIGROUPS_TEST_CASE(
"KnuthBendix" ,
"120" ,
"example with undecidable word problem" ,
"[knuthbendix][fail]" ) {
KnuthBendix k;
k.set_alphabet(
"ab" );
k.add_rule(
"abaabb" ,
"bbaaba" );
k.add_rule(
"aababba" ,
"bbaaaba" );
k.add_rule(
"abaaabb" ,
"abbabaa" );
k.add_rule(
"bbbaabbaaba" ,
"bbbaabbaaaa" );
k.add_rule(
"aaaabbaaba" ,
"bbaaaa" );
k.run_for(std::chrono::seconds(10));
REQUIRE(k.finished());
}
}
// namespace fpsemigroup
}
// namespace libsemigroups
Messung V0.5 C=85 H=88 G=86
¤ Dauer der Verarbeitung: 0.4 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland