227k views
3 votes
Given two regular expressions r1 and r2, construct a decision procedure to determine whether the language of r1 is contained in the language r2; that is, the language of r1 is a subset of the language of r2.

User Arturas M
by
7.4k points

1 Answer

6 votes

Answer:

Test if L(M1-2) is empty.

Construct FA M2-1 from M1 and M2 which recognizes the language L(>M2) - L(>M1).

COMMENT: note we use the algorithm that is instrumental in proving that regular languages are closed with respect to the set difference operator.

Test if L(M2-1) is empty.

Answer yes if and only if both answers were yes.

Step-by-step explanation:

An algorithm must be guaranteed to halt after a finite number of steps.

Each step of the algorithm must be well specified (deterministic rather than non-deterministic).

Three basic problems:

Given an FA M and an input x, does M accept x?

Is x in L(M)

Given an FA M, is there a string that it accepts?

Is L(M) the empty set?

Given an FA M, is L(M) finite?

Algorithm for determining if M accepts x.

Simply execute M on x.

Output yes if we end up at an accepting state.

This algorithm clearly halts after a finite number of steps, and it is well specified.

This algorithm is also clearly correct.

Testing if L(M) is empty.

Incorrect "Algorithm"

Simulate M on all strings x.

Output yes if and only if all strings are rejected.

The "algorithm" is well specified, and it is also clearly correct.

However, this is not an algorithm because there are an infinite number of strings to simulate M on, and thus it is not guaranteed to halt in a finite amount of time.

COMMENT: Note we use the algorithm for the first problem as a subroutine; you must think in this fashion to solve the problems we will ask.

Correct Algorithm

Simulate M on all strings of length between 0 and n-1 where M has n states.

Output no if and only if all strings are rejected.

Otherwise output yes.

This algorithm clearly halts after a finite number of steps, and it is well specified.

The correctness of the algorithm follows from the fact that if M accepts any strings, it must accept one of length at most n-1.

Suppose this is not true; that is, L(M) is not empty but the shortest string accepted by M has a length of at least n.

Let x be the shortest string accepted by M where |x| > n-1.

Using the Pumping Lemma, we know that there must be a "loop" in x which can be pumped 0 times to create a shorter string in L.

This is a contradiction and the result follows.

COMMENT: There are more efficient algorithms, but we won't get into that.

Testing if L(M) is finite

Incorrect "Algorithm"

Simulate M on all strings x.

Output yes if and only if there are a finite number of yes answers.

This "algorithm" is well specified and correct.

However, this is not an algorithm because there are an infinite number of strings to simulate M on, and thus it is not guaranteed to halt in a finite amount of time.

COMMENT: Note we again use the algorithm for the first problem as a subroutine.

Correct Algorithm

Simulate M on all strings of length between n and 2n-1 where M has n states.

Output yes if and only if no string is accepted.

Otherwise output no.

This algorithm clearly halts after a finite number of steps, and it is well specified.

The correctness of the algorithm follows from the fact that if M accepts an infinite number of strings, it must accept one of length between n and 2n-1.

This builds on the idea that if M accepts an infinite number of strings, there must be a "loop" that can be pumped.

This loop must have length at most n.

When we pump it 0 times, we have a string of length less than n.

When we pump it once, we increase the length of the string by at most n so we cannot exceed 2n-1. The problem is we might not exceed n-1 yet.

The key is we can keep pumping it and at some point, its length must exceed n-1, and in the step it does, it cannot jump past 2n-1 since the size of the loop is at most n.

This proof is not totally correct, but it captures the key idea.

COMMENT: There again are more efficient algorithms, but we won't get into that.

Other problems we can solve using these basic algorithms (and other algorithms we've seen earlier this chapter) as subroutines.

COMMENT: many of these algorithms depend on your understanding of basic set operations such as set complement, set difference, set union, etc.

Given a regular expression r, is Lr finite?

Convert r to an equivalent FA M.

COMMENT: note we use the two algorithms for converting a regular expression to an NFA and then an NFA to an FA.

Test if L(M) is finite.

Output the answer to the above test.

Given two FAs M1 and M2, is L(M1) = L(M2)?

Construct FA M1-2 from M1 and M2 which recognizes the language L(>M1) - L(>M2).

COMMENT: note we use the algorithm that is instrumental in proving that regular languages are closed with respect to the set difference operator.

Test if L(M1-2) is empty.

Construct FA M2-1 from M1 and M2 which recognizes the language L(>M2) - L(>M1).

COMMENT: note we use the algorithm that is instrumental in proving that regular languages are closed with respect to the set difference operator.

Test if L(M2-1) is empty.

Answer yes if and only if both answers were yes.

User Saeedgnu
by
6.3k points