Dựa trên tư tưởng của giải thuật, ta nhận thấy quá trình tìm kiếm một giả thiết có kích thước nhỏ nhất thoả mãn luật ghép nối như là một bài toán tìm kiếm trong một không gian tìm kiếm gồm các bảng quan sát. Giải thuật sử dụng chiến lược duyệt theo chiều rộng bởi vì chiến lược này đảm bảo chắc chắn rằng giả thiết được tạo ra là giả thiết tối thiểu. Chi tiết của giải thuật tạo giả thiết tối thiểu được minh hoạ dưới dạng giả mã trong Giải thuật 2. Trong thủ tục này giải thuật sử dụng một cấu trúc dữ liệu hàng đợi để chứa các bảng quan sát được tạo ra. Những bảng quan sát này được sử dụng để tạo ra các giả thiết ứng cử viên cho luật ghép nối. Ban đầu, thủ tục thực hiện đặt hàng đợi là tập rỗng (dòng 1). Chúng ta sẽ đưa bảng quan sát đầu tiên OT0 = (S0, E0, T0) chính là gốc của cây tìm kiếm vào trong hàng đợi, trong đó S0 = E0 = {λ} (λ được thể hiện như là một chuỗi rỗng) (dòng 2). Tiếp đó, thủ tục sẽ lấy một bảng quan sát OTi từ đỉnh của hàng đợi q (dòng 4). Nếu bảng quan sát OTi chứa giá trị “?” (dòng 5), chúng ta sẽ thu được tất cả các bảng quan sát con của bảng quan sát OTi bằng cách thay tất cả “?” trong OTi bởi giá trị false hoặc true (dòng 6). Tất cả các bảng quan sát
thu được sau đó sẽ được đẩy vào hàng đợi q (dòng 7). Ngược lại, tức là bảng quan sát OTi không chứa giá trị “?”. Trong trường hợp này, nếu OTi không phải là bảng đóng (dòng 10), giải thuật thực hiện cập nhật bảng quan sát OTi bằng cách gọi thủ tục make_closed(OTi) (dòng 11) ta thu được OT. Sau đó, OT sẽ được đưa vào hàng đợi q chờ xử lý (dòng 12). Trong trường hợp ngược lại, bảng quan sát OTi là bảng đóng, một giả thiết ứng cử viên Ai được tạo ra từ OTi (dòng 14). Nếu giả thiết Ai không thoả mãn bước thứ nhất của luật ghép nối. Giải thuật sẽ thực hiện phân tích phản ví dụ cex để
tìm ra một hậu tố e của cex để minh chứng cho sự khác nhau giữa L(Ai) và ngôn ngữ của giả thiết được huấn luyện. Sau đó, e sẽ được thêm vào tập Ei của bảng quan sát OTi (dòng 16). Tiếp theo, giải thuật thực hiện cập nhật bảng quan sát OTi bằng cách sử dụng hàm Update(OTi) (dòng 17), kết quả thu được là bảng OT. OT sau đó được đưa vào hàng đợi q chờ xử lý (dòng 18). Nếu ngược lại, tức là bước thứ nhất của luật ghép nối được thoả mãn, giải thuật sẽ thực hiện kiểm tra bước thứ hai của luật ghép nối. Nếu bước thứ hai không thoả mãn (dòng 20). Giải thuật sẽ thực hiện phân tích phản ví dụ cex để xác định xem có phải hệ thống không thoả mãn thuộc tính p hay là giả thiết Ai đưa ra là quá mạnh để M2 thoả mãn. Nếu cex vi phạm thuộc tính p (dòng 21), giải thuật sẽ trả lại lỗi và kết thúc (dòng 22). Ngược lại, tức là giả thiết Ai là quá mạnh để M2 thoả mãn. Giải thuật thực hiện phân tích phản ví dụ cex để tìm ra hậu tố e. Sau đó, e sẽ được thêm vào tập Ei của bảng quan sát OTi (dòng 24). Tiếp đó, giải thuật thu được một bảng quan sát OT được cập nhật từ bảng quan sát OTi bằng cách sử dụng hàm Update(OTi) (dòng 25). OT sau đó được đưa vào hàng đợi q chờ xử lý (dòng 26). Thủ tục lặp lại toàn bộ quá trình bằng cách lặp từ dòng 3 đến dòng 34 cho đến khi hàng đợi q rỗng hoặc một giả thiết tối thiểu được tạo ra.
Giải thuật 2 Giải thuật sinh giả thiết tối thiểu
Input: M1, M2, p: hai mô hình thành phần M1 và M2, và thuộc tính được yêu cầu p. Output: Am(p) hoặc cex: một giả thiết Am(p) với kích thước nhỏ nhất nếu M1||M2 thoả mãn p hoặc một phản ví dụ nếu ngược lại.
1: Khởi gán, q = empty {q là một hàng đợi rỗng }
2: q.put(OT0) {OT0 = (S0, E0, T0), S0 = E0 = {λ}, trong đó λ là một chuỗi rỗng} 3: while q <> empty do
4: OTi = q.get() {Lấy OTi từ đỉnh của hàng đợi q} 5: if OTi chứa “?” then
6: for mỗi bảng con OT của OTi do
7: q.put(OT) {đưa OT vào hàng đợi q}
8: end for 9: else 10: if OTi chưa đóng then 11: OT = make_closed(OTi) 12: q.put(OT) 13: else 14: Xây dựng DFA Ai từ bảng đóng OTi
15: if Step1(Ai) lỗi với cex then
16: Thêm hậu tố e của cex vào tập Ei.
17: OT = Update(OTi)
18: q.put(OT)
20: if Step2(Ai) lỗi với cex then
21: if cex chỉ ra hệ thống vi phạm p then
22: return cex
23: else
24: Thêm hậu tố e của cex vào tập Ei
25: OT = Updated(OTi) 26: q.put(OT) 27: end if 28: else 29: return Ai 30 end if 31: end if 32: end if 33: end If 34: end while