Input
Alphabet \(A\).
Two tuples \(s\) and \(t\) of equal length containing strings over \(A\).
For bounded problem: \(k \in \mathbb{N}\).
Output
Decision version
True or False.
Non-decision version
Indices: \(\{0, 1, \ldots, |s| \}\).
Any tuple of indices \((i_0, i_1, \ldots, i_n)\) so that
\(\oplus_{j=0}^n \\, s[i_j] = \oplus_{j=0}^n \\, t[i_j]\)
where \(\oplus\) means concatenate and
\(s[i_j]\) means the element of \(s\) at index \(i_j\).
So, \(1001 \oplus 00\) is \(100100\).
If no such tuple of indices exists, return False.
Algorithm
For the bounded problem.
Exercise
Write a Python function called corresponds.
It should take two lists of the same length containing strings over the same alphabet.
It shouls also take a positive integer k.
It should return any list (of length at most k) of indices of the two lists such that it solves the Post Correspondence Problem.
If there is none, the function should return False.
import itertools as it
def correspond(s, t, k):
# List of the indices of s and t.
inds = list(range(len(s)))
# Loop up to and including k.
for i in range(1, k + 1):
# Generate all products of length i.
for w in it.product(inds, repeat=i):
# Concatenate strings in s.
x = ''.join(s[k] for k in w)
# Concatenate strings in t.
y = ''.join(t[k] for k in w)
# Compare.
if x == y:
return w
# If we get here, there is no tuple.
return False