Hai biểu thức chính quy được gọi là tương đương nếu chúng biểu diễn cùng một ngôn ngữ (cùng tập hợp xâu được khớp). Đây là bài toán nền tảng để kiểm chứng các phép biến đổi/tối ưu trên động cơ regex — ví dụ kiểm tra xem hai cách viết lại của cùng một mẫu có thực sự sinh ra cùng tập xâu hay không.
Cho hai biểu thức chính quy p1,p2 (theo đúng văn phạm ở bài "Động cơ regex bằng dựng NFA Thompson"). Gọi Σ là hợp các chữ cái thường xuất hiện trong p1 hoặc p2. Hãy xác định L(p1)=L(p2) hay không, tức là p1 và p2 có khớp đúng cùng một tập xâu trên Σ∗ hay không.
Gợi ý cách giải chuẩn: dựng hai DFA D1,D2 tương ứng cho p1,p2 trên cùng bảng chữ cái Σ (qua NFA Thompson rồi dựng tập con), sau đó duyệt (BFS/DFS) automat tích (product automaton) trên các cặp trạng thái (u1,u2), xuất phát từ (start1,start2): nếu tồn tại một cặp trạng thái đến được mà đúng một trong hai trạng thái u1,u2 là trạng thái kết thúc của automat tương ứng (tức cặp này thuộc hiệu đối xứng L(p1)△L(p2)), thì p1 và p2 không tương đương; nếu duyệt hết mọi cặp đến được mà không gặp trường hợp như vậy thì hai biểu thức tương đương.
Dòng 1 chứa p1 (0≤∣p1∣≤60; có thể là dòng rỗng). Dòng 2 chứa p2 (0≤∣p2∣≤60; có thể là dòng rỗng).
In YES nếu p1 và p2 tương đương, ngược lại in NO.
Ví dụ:
Đầu vào:
a|b
b|a
Đầu ra:
YES
Đầu vào:
(a|b)*
(a*b*)*
Đầu ra:
YES
Đang tải editor...