kdrag.solvers.kb.string
See https://www.philipzucker.com/string_knuth/
Functions
|
String Knuth-Bendix completion algorithm. |
|
deduce all possible critical pairs from R |
|
critical pairs https://en.wikipedia.org/wiki/Critical_pair_(term_rewriting) |
|
Find and replace the first occurrence of lhs in s with rhs. |
|
Rewrite to a fixed point using rules R. |
|
Order by length, then tie break by contents lexicographically. |
|
|
|
Return index when s is a subsequence of t, None otherwise |
- kdrag.solvers.kb.string.KB(E)
String Knuth-Bendix completion algorithm.
>>> e = 0 >>> a = 1 # a is rotate square >>> b = 2 # b is flip square horizontally. >>> E = [ ((-a, a), ()), ((-b,b), ()), ((a,a,a,a), ()), ((b,b), ()), ((a,a,a,b), (b,a)) ] >>> R = KB(E) >>> E,R = simplify(R)
- kdrag.solvers.kb.string.deduce(R)
deduce all possible critical pairs from R
- kdrag.solvers.kb.string.overlaps(s, t)
critical pairs https://en.wikipedia.org/wiki/Critical_pair_(term_rewriting)
>>> assert set(overlaps((1,2), (2,3))) == {(1,2,3)} >>> assert set(overlaps((1,2), (3,2))) == set() >>> assert set(overlaps((1,2), (2,1))) == {(1,2,1), (2,1,2)} >>> assert set(overlaps((1,2), (1,2))) == {(1,2)} >>> assert set(overlaps((2,2), (2,2,3))) == {(2,2,3), (2,2,2,3)} >>> assert set(overlaps((), (1,2))) == {(1,2)}
- kdrag.solvers.kb.string.replace(s: tuple, lhs: tuple, rhs: tuple) tuple
Find and replace the first occurrence of lhs in s with rhs.
>>> replace((1,2,3,4), (2,3), (5,6)) (1, 5, 6, 4) >>> replace((1,2,3,4), (2,3), (5,6,7)) (1, 5, 6, 7, 4) >>> replace((1,2,3,4), (2,3), (5,6,7,8)) (1, 5, 6, 7, 8, 4) >>> replace((1,1), (4,4), (2,2)) (1, 1)
- Parameters:
s (tuple)
lhs (tuple)
rhs (tuple)
- Return type:
tuple
- kdrag.solvers.kb.string.rewrite(s, R, exclude=-1)
Rewrite to a fixed point using rules R.
Exclude is useful for simplifying a rule
>>> rewrite((1,2,3,4), [((2,3), (5,6)), ((5,6), (7,8))]) (1, 7, 8, 4) >>> rewrite((1,1,1,1,1,1), [((1,1), ())]) () >>> rewrite((1,1,1,1,2,1), [((1,1), ())]) (2, 1)
- kdrag.solvers.kb.string.shortlex_swap(s, t)
Order by length, then tie break by contents lexicographically. Returns a tuple (s’, t’) where t’ is the “shorter” or “smaller” of the two. Asserts False if s and t are equal.
>>> shortlex_swap((1,2,3), (0,0)) ((1, 2, 3), (0, 0)) >>> shortlex_swap((1,2,3), (1,2,4)) ((1, 2, 4), (1, 2, 3))
- kdrag.solvers.kb.string.simplify(R)
- kdrag.solvers.kb.string.subseq(s: Sequence, t: Sequence) int | None
Return index when s is a subsequence of t, None otherwise
>>> subseq("abc", "abacabadabacaba") is None True >>> subseq("abc", "abacabc") 4
- Parameters:
s (Sequence)
t (Sequence)
- Return type:
int | None