3.5.1. Thuật giải cho câu truy vấn loại 1.
?IS <bieu_thuc_kiem_tra> WHERE <bieu_thuc_dieu_kien>
Thủ tục AnswerQ1: Thủ tục kiểm tra tính đúng/sai của câu truy vấn trong
Input: danh sách đối tượng, danh sách kiểu, danh sách sự kiện và danh sách kiểu sự kiện của câu truy vấn có tên lần lượt: dsdoituongQ, dskieuQ, dssukienQ, dskieuskQ.
Output: TRUE/FALSE.
Gọi hàm: AnswerQ1(dsdoituongQ, dskieuQ, dssukienQ, dskieuskQ)
Bước 1: Nếu giả thiết truy vấn là sự kiện cho giá trị cụ thể thì không cần duyệt
luật và gọi hàm xử lý riêng THRieng( dsdoituongQ, dskieuQ, dssukienQ,
dskieuskQ) , ngược lại sang bước 2 để duyệt luật.
Bước 2: Gọi thủ tục KiemTra(cs, dsdoituongQ, dskieuQ, dssukienQ), nếu true
thì tiếp tục bước 3, ngược lại sang bước 4.
Bước 3: So khớp các sự kiện luật đang xét với các sự kiện của truy vấn. Có các trường hợp sau:
+Trường hợp 1: giả thiết của luật không khớp với giả thiết truy vấn. Tiếp tục bước 4.
+Trường hợp 2: giả thiết của luật khớp với giả thiết truy vấn, chúng ta kiểm tra tiếp phần kết luận của luật và truy vấn
*Trường hợp 2.1: phần kết luận của luật và truy vấn không khớp thì nạp kết luận của luật vào danh sách sự kiện của truy vấn dssukienQ[1]. Tiếp tục bước 4.
*Trường hợp 2.2: kết luận của luật và truy vấn khớp, kết quả vấn tin là TRUE. Thuật toán dừng.
Bước 4:
-Nếu luật đang xét là luật cuối cùng trong danh sách luật thì xét tiếp trong lượt duyệt tất cả các luật, dssukienQ có cập nhật thêm được sự kiện mới không, nếu có thì quay lại bước 2 để duyệt luật từ đầu; ngược lại nếu không có sự kiện mới thì kết quả vấn tin là FALSE. Thuật toán dừng.
-Nếu luật đang xét không phải luật cuối cùng trong danh sách luật thì quay lại bước 2 để duyệt luật tiếp theo.
dsdoituongQ [], dskieuQ [], dssukienQ[[gt],[kl]], dskieuskQ [[gt],[kl]] dssukienQ[1]có giá trị cụ thể THRieng( dsdoituongQ, dskieuQ, dssukienQ, dskieuskQ)
Duyệt luật trong dsluat cs := 1 ;
KiemTra(cs, dsdoituongQ, dskieuQ, dssukienQ)
So khop luật thứ chisoluat với các luật trong
dssukienQ[1] Gt luật khớp với các gt trong dssukienQ[1] kl luật khớp với kl trong dssukienQ[2 ] TRUE End Nạp kl luật vào dssukienQ[1] chisoluatcuối cùng trong dsluat Có cập nhật dssukienQ[1 ] FALSE End cs:=1 cs ++ Y N Y Y Y Y Y N N N N N End Hình 3.1: Lưu đồ thuật toán loại 1
Giải thuật trên thực hiện theo ý tưởng sau: truy vấn loại 1 xét hai trường hợp: + Trường hợp bieu_thuc_dieu_kien có giá trị cụ thể, ta xử lý trong hàm THRieng. + Trường hợp bieu_thuc_dieu_kien là sự kiện không phải giá trị cụ thể thì ta phải duyệt tất cả các luật trong CSTT để kiểm tra tính đúng sai của các sự kiện trong câu truy vấn. Thực hiện so khớp các sự kiện của câu truy vấn với từng luật duyệt qua. Có hai trường hợp xảy ra:
• Trường hợp 1: câu truy vấn (gồm giả thiết và kết luận) khớp với luật (giả thiết, kết luận) đang xét thì kết quả vấn tin là TRUE. Thuật toán dừng.
• Trường hợp 2: câu truy vấn không khớp với luật thì có hai khả năng hoặc giả thiết không khớp, hoặc kết luận không khớp. Lúc đó chúng ta xem xét điều kiện dừng của bài toán để xét xem có duyệt luật tiếp không. Điều kiện dừng là luật đang dùng để so khớp là luật cuối cùng trong CSTT và trong lượt duyệt các luật đó, giả thiết của truy vấn không cập nhật thêm được sự kiện mới. Vì số luật trong CSTT là giới hạn nên số sự kiện mới cập nhật vào danh sách giả thiết của truy vấn sẽ giới hạn. Vì vậy quá trình duyệt luật sẽ không bị loop.
Trường hợp xấu nhất xảy ra là giả thiết truy vấn khớp với luật, kết luận truy vấn thì không khớp với bất cứ luật nào thì chương trình phải duyệt ít nhất là hai lượt các luật trong CSTT.
3.5.2. Thuật giải cho câu truy vấn loại 2.
Thủ tục AnswerQ2: Thủ tục vấn tin cho biết định nghĩa một loại khái niệm
trong ontology.
Input: dstukhoa, dsten, dsdoiso. Output: danh sách sự kiện
Bước 1: Nếu danh sách dsten=[“”] và dsdoiso=[] thì sang bước 2, ngược lại
Bước 2: (loại không đối số)
Nếu op(dstukhoa) = “CONCEPTS” thì đọc 5 file: cobject_kinds.txt, hierarchy.txt, relation_kinds.txt, operator_kinds.txt, rule_kinds.txt.
Nếu op(dstukhoa)= “COBJECTS” thì đọc file: cobject_kinds.txt. Nếu op(dstukhoa) = “HIERARCHIES” thì đọc file: hierarchy.txt. Nếu op(dstukhoa) = “RELATIONS” thì đọc file: relation_kinds.txt. Nếu op(dstukhoa) = “OPERATORS” thì đọc file: operator_kinds.txt. Nếu op(dstukhoa) = “RULES” thì đọc file: rule.txt.
Bước 3: (loại có đối số)
Nếu dstukhoa= [“WHAT CONCEPT”] thì dò tìm dsten[1] trong danh sách biến ObjStruct[k][1] để được chỉ số k tìm thấy, kq:=ObjStruct[k][2]. Thuật toán dừng.
Nếu dstukhoa = [“WHAT RELATION”] thì dò tìm dsten[1] trong danh sách biến RelaStruct[k][1] để được chỉ số k tìm thấy, kq:=RelaStruct[k][4]. Thuật toán dừng.
Nếu dstukhoa = [“WHAT OPERATOR”] thì dò tìm dsten[1] trong danh sách biến OpStruct[k][1] để được chỉ số k tìm thấy, kq:=OpStruct[k][4]. Thuật toán dừng.
Nếu dstukhoa= [“WHAT ATTRIBUTE”] thì dò tìm dsten[1] trong danh sách biến ObjStruct[k][1] để được chỉ số k tìm thấy, kq_att:=ObjStruct[k][4], kq_typeatt:= ObjStruct[k][5]. Thuật toán dừng.
Nếu dstukhoa = [“WHAT FUNCTION”] thì dò tìm dsten[1] trong danh sách biến FuncStruct[k][1] để được chỉ số k tìm thấy, kq:=FuncStruct[k][4]. Thuật toán dừng.
Nếu dstukhoa = [“WHAT RULE”] thì dò tìm dsten[1] trong danh sách biến RuleStruct[k][1] để được chỉ số k tìm thấy, kq:=RuleStruct[k][5]. Thuật toán dừng.
Nếu dstukhoa= [“WHAT CONSTRAINT”] thì dò tìm dsten[1] trong danh sách biến ObjStruct[k][1] để được chỉ số k tìm thấy, kq:=ObjStruct[k][6]. Ngược lại, nếu dstukhoa= [“WHAT CONSTRAINT”, “RELATED”] thì duyệt tiếp RuleStruct[k][6], kết quả là những sự kiện nào chứa dsten[2]. Thuật toán dừng.
Nếu dstukhoa= [“WHAT CRELATION”] thì dò tìm dsten[1] trong danh sách biến ObjStruct[k][1] để được chỉ số k tìm thấy, kq:=RuleStruct[k][6]. Ngược lại, nếu dstukhoa= [“WHAT CONSTRAINT”, “RELATED”] thì duyệt tiếp RuleStruct[k][6], kết quả là những sự kiện nào chứa dsten[2]. Thuật toán dừng.
Xử lý trường hợp truy vấn có chứa đối số hoặc không chứa đối số tương tự nhau. Đó là thực hiện kiểm tra các thành phần câu truy vấn để lấy thông tin thích hợp từ CSTT.
Begin
dstukhoa, dsten, dsdoiso
dsten=[] and dsdoiso=[] Xử lý trường hợp truy vấn không chứa đối số Y End Xử lý trường hợp có chứa đối số End N Hình 3.2: Lưu đồ thuật toán loại 2
3.5.3. Thuật giải cho câu truy vấn loại 3.
Thủ tục AnswerQ3: Thủ tục vấn tin cho biết tính chất một loại khái niệm
trong ontology.
Input: dstukhoa, dsten, dsdoiso. Output: danh sách sự kiện.
Bước 1: Kiểm tra dstukhoa, nếu dstukhoa có một phần tử thì thực hiện bước 2,
ngược lại đến bước 3.
Bước 2: (dstukhoa có một phần tử)
Nếu dstukhoa có chứa một trong các phần tử trong [“WHAT PROPERTY”, “WHAT PROPERTY RELATION”, “WHAT PROPERTY OPERATOR”] thì dò tìm dsten[1] trong danh sách RuleStruct[k][4] để tìm k, kết quả là các RuleStruct[k][5]. Thuật toán dừng.
Bước 3: (dstukhoa có hai phần tử)
Nếu dstukhoa có hai phần tử và dstukhoa[2]= “RELATED” thì dò tìm dsten[1] trong danh sách RuleStruct[k][4] để tìm k, kết quả là các RuleStruct[k][5] chứa các giá trị còn lại trong dsten. Thuật toán dừng.
Nếu dstukhoa nhiều hơn hai phần tử và dstukhoa[2] = “WHERE” thì dò tìm dsten[1] trong danh sách RuleStruct[k][4] để tìm k, kết quả là các RuleStruct[k][5] chứa giá trị còn lại trong dsten và có RuleStruct[k][5][1] chứa dsdieukien. Thuật toán dừng.
Nếu dstukhoa nhiều hơn hai phần tử và dstukhoa có chứa “RELATED” thì dò tìm dsten[1] trong danh sách RuleStruct[k][4] để tìm k, kết quả là các RuleStruct[k][5] chứa các giá trị còn lại trong dsten và có RuleStruct[k][5][1] chứa dsdieukien. Thuật toán dừng.
3.5.4. Thuật giải cho câu truy vấn loại 4.
Thủ tục AnswerQ4: Thủ tục vấn tin cho biết thông tin thỏa điều kiện cho trước.
Input: dstukhoa, dsten, dsdieukien. Output: danh sách sự kiện.
Bước 1: Nếu dstukhoa có chứa “WHAT HYPOTHESIS” thì thực hiện bước 2,
ngược lại đến bước 3.
Bước 2:
Nếu dstukhoa không chứa “RELATED” thì dò tìm trong danh sách RuleStruct, kết quả là các luật có kết luận chứa các điều kiện trong dsdieukien.
Nếu dstukhoa có chứa “RELATED” thì dò tìm trong danh sách RuleStruct, kết quả là các luật có chứa đối tượng liên quan trong dsten và kết luận chứa các điều kiện trong dsdieukien.
Bước 3:
Nếu dstukhoa chứa “WHAT GOAL” và “WITH” thì dò tìm trong danh sách RuleStruct, kết quả là các luật có giả thiết thỏa các điều kiện trong dsdieukien.
Nếu dstukhoa chứa “WHAT GOAL”, “WITH” và “RELATED” thì dò tìm trong danh sách RuleStruct, kết quả là các luật có chứa đối tượng liên quan trong dsten và giả thiết chứa các điều kiện trong dsdieukien.
3.5.5. Chương trình chính.
Input: chuỗi câu truy vấn.
Output: tập sự kiện đáp ứng câu truy vấn.
Trước khi cho thực hiện truy vấn, cần đọc cơ sở tri thức thông qua thủ tục Init(). Thủ tục này chỉ gọi một lần trong mỗi phiên làm việc.
Thủ tục chính AnswerQuery:
AnswerQuery:=proc(query)
Bước 1: đọc và phân tích câu truy vấn.
Bước 2: nhận diện loại truy vấn, ứng với mỗi loại kiểm tra cú pháp câu truy vấn có đúng không và xử lý theo mỗi loại.
Nếu loaiQ =1 thì gọi thủ tục KiemTraCuPhapQ1, nếu đúng thì gọi tiếp thủ tục xử lý AnswerQ1(query)
ngược lại nếu loaiQ = 2 thì gọi thủ tục KiemTraCuPhapQ2, nếu đúng thì gọi tiếp thủ tục xử lý AnswerQ2(query)
ngược lại nếu loaiQ = 3 thì gọi thủ tục KiemTraCuPhapQ3, nếu đúng thì gọi tiếp thủ tục xử lý AnswerQ3(query)
ngược lại gọi thủ tục KiemTraCuPhapQ4, nếu đúng thì gọi tiếp thủ tục xử lý AnswerQ4(query)
Chương 4. ỨNG DỤNG
Chương này vận dụng mô hình ontology COKB và ngôn ngữ truy vấn đã trình bày ở hai chương trước vào miền tri thức cụ thể đại số tuyến tính. Ứng dụng này hướng đến việc xây dựng hệ cơ sở tri thức và hệ thống phục vụ truy vấn tri thức về đại số tuyến tính, trả lời những câu hỏi thường gặp về lý thuyết trong đại số tuyến tính. Chương trình được cài đặt bằng Maple 12.
4.1. Mô tả ứng dụng
Hoạt động truy vấn tri thức dựa trên CSTT các đối tượng tính toán về ĐSTT được tổ chức theo mô hình COKB. Tổ chức CSTT bao gồm các tập tin văn bản có cấu trúc theo ngôn ngữ đặc tả ở chương 2. Quá trình thực hiện truy vấn như sau: Khi người dùng (user) nhập vào một câu truy vấn theo cú pháp quy định ở chương 3, chương trình đọc và phân tích câu truy vấn xem nó thuộc loại truy vấn nào. Việc phân tích đó sẽ đưa về danh sách các thông tin theo mỗi loại truy vấn, bao gồm: danh sách các đối tượng, thuộc tính, hàm, quan hệ, kiểu đối tượng tương ứng, các sự kiện và kiểu sự kiện tương ứng, các từ khóa, đối số. Sau đó bộ phận xử lý sẽ tìm kiếm và kiểm tra tính hợp nhất dựa trên CSTT và thể hiện kết quả tìm được. Có thể minh họa qua sơ đồ sau:
Hình 4.1: Sơ đồ quá trình thực hiện truy vấn
Ví dụ 4.1: Nếu A, B là ma trận khả nghịch thì AB có khả nghịch không ?
?IS KHA_NGHICH(A*B) WHERE A:MA_TRAN_VUONG,
B:MA_TRAN_VUONG WITH {KHA_NGHICH(A), KHA_NGHICH(B)};
Khi nhập câu truy vấn, chương trình phân tích chuỗi cú pháp câu, nhận diện truy vấn thuộc loại 1 và trả về danh sách các thông tin gồm:
Phân tích câu truy vấn Xử lý BEGIN END User nhập câu hỏi Kết quả vấn tin
+Danh sách đối tượng = [A, B]
+Danh sách kiểu đối tượng = [“MA_TRAN_VUONG”, “MA_TRAN_VUONG”]
+Danh sách sự kiện = [[KHA_NGHICH(A), KHA_NGHICH(B)], [KHA_NGHICH(A*B)]]
+Danh sách loại sự kiện = [[sk7, sk7],[sk7]]
Sau đó chương trình nhận sự kiện giả thiết và kết luận để xử lý. Kết quả xử lý trả về cho người dùng: Kết quả vấn tin là TRUE.
4.2. Tổ chức các biến lưu trữ cơ sở tri thức trong chương trình.
Việc lưu trữ nội dung của cơ sở tri thức thông qua các biến toàn cục sau:
1/ ObjStruct: là danh sách gồm các thành phần có dạng:
[[<tên kiểu object 1>, <cấu trúc của kiểu object1>], [<tên kiểu object 2>, <cấu trúc của kiểu object2>],…]
[1] Tên kiểu Cobject có thể ghi ở hai dạng: - ví dụ dạng 1: MA_TRAN
- ví dụ dạng 2: MA_TRAN[m, n, a] [2] Cấu trúc của kiểu object gồm có:
[2.1] Chuỗi định nghĩa đối tượng.
[2.2] Danh sách các sự kiện đặc biệt hóa đối tượng. [2.3] Danh sách các tên thuộc tính.
[2.4] Danh sách các kiểu tương ứng của thuộc tính.
[2.5] Danh sách các điều kiện ràng buộc trên các thuộc tính. [2.6] Danh sách các quan hệ tính toán trên các thuộc tính.
[2.7] Danh sách các tính chất hay các sự kiện mặc nhiên có đối với loại đối tượng này.
Ví dụ 4.2: ["MA_TRAN","Mot ma tran A dang mxn tren truong K la mot bang gom mxn phan tu trong K duoc viet thanh m dong va n cot.",[],[m,n,a,ROW,COL],["INTEGER","INTEGER","ARRAY(1 .. m,1 ..
n)","ARRAY(1 .. m)","ARRAY(1 .. n)"],[0<m,0<n],[m=so_dong_cua_a,n=so_cot_cua_a],[],["","",[],[],[{}
,{}]]],["MA_TRAN_ZERO","Mot ma tran A dang mxn tren truong K la ma tran khong (ma tran zero) neu A[i, j] = 0, voi moi i, j.",["forall i, j: A[i, j]=0 ;"],[],[],[],[],[],[]],...]
2/ HierStruct: Là danh sách các thông tin phân cấp khái niệm có dạng:
[[<dt1>,<cấp cha dt1>],[<dt2>,<cấp cha dt2>],...]
Ví dụ 4.3:
[[“MA_TRAN_VUONG”, “MA_TRAN”],...]
3/ RelaStruct: Là danh sách gồm các cấu trúc thông tin về loại quan hệ có dạng:
[[ <tên quan hệ>, danh sách đối số, danh sách kiểu đối số, danh sách sự kiện xác định quan hệ], […], …]
Ví dụ 4.4:
[[“GIAO_HOAN”, [A, B], [“MA_TRAN”, “MA_TRAN”],[A*B = B*A]],...]
4/ OpStruct: Là danh sách gồm các cấu trúc thông tin về phép toán có dạng:
[[ <tên phép toán>, dãy các đối số và giá trị trả về, dãy kiểu đối số, dãy các sự kiện xác định phép toán], […], …]
Ví dụ 4.5:
[[“CONG”, [A, B, C], [“MA_TRAN”, “MA_TRAN” ,
“MA_TRAN”],[ FORALL(i, j), C.a[i, j] := A.a[i, j] + B.a[i, j]],...]
5/ FuncStruct: Là danh sách gồm các cấu trúc thông tin về hàm có dạng:
[[ <tên hàm>, [đối số], [kiểu đối số], {<sự kiện/câu lệnh định nghĩa hàm>}], [...],...]
[[HANG,[A],[“MA_TRAN”],{B: MA_TRAN[m’,n’,a’], B = MA_TRAN_RUT_GON(A),r =0,for i in [1..m’] do
if B.ROW[i]<>0 then
r = r+1, fi }],…]
6/ RuleStruct: Là danh sách các luật dẫn, mỗi luật có cấu trúc danh sách dưới dạng:
[[<tên luật>, <loại luật>, [tên biến đại diện], [kiểu tương ứng của các biến đại diện], [ {các sự kiện giả thiết}, {các sự kiện kết luận} ]],…]
Ví dụ 4.7:
[[“”,“tinh_chat_phep_toan”,[A, B],[MA_TRAN,
MA_TRAN],[{ A^T = B^T},{ A = B }]], […], …]
4.3. Một số thủ tục chính
Thủ tục 1: Thủ tục PhanTichQry(chuỗi query) để phân tích câu truy vấn thành
các danh sách.
Input: chuỗi câu truy vấn. Output:
+ Nếu câu truy vấn là loại 1, output gồm 4 danh sách : danh sách đối tượng, danh sách kiểu đối tượng tương ứng, danh sách các điều kiện của câu truy vấn (sự kiện) và danh sách kiểu sự kiện tương ứng.
-Danh sách đối tượng:
dsdoituongQ:=[A, B, x, y,…] -Danh sách kiểu đối tượng:
dskieudoituongQ:=[< kiểu dữ liệu 1>,< kiểu dữ liệu 2>] -Danh sách các điều kiện của câu truy vấn:
dssukienQ:=[[<gt1>,<gt2>,…,<gtn>],[<kl>]] -Danh sách các kiểu tương ứng với các điều kiện của câu truy vấn:
+ Nếu câu truy vấn là loại 2, output gồm 3 danh sách sau: -Danh sách từ khóa
dstukhoa:=[<từ khóa 1>,<từ khóa 2>,…] -Danh sách tên đối tượng
dsten:=[A, B, …] -Danh sách đối số
dsdoiso:=[<kiểu 1>, <kiểu 2>]
+ Nếu câu truy vấn là loại 3 và 4, output gồm 7 danh sách sau: danh sách từ khóa, danh sách tên, danh sách đối số, danh sách đối tượng, danh sách kiểu đối tượng, danh sách điều kiện, danh sách kiểu điều kiện.
-Danh sách từ khóa
dstukhoa:=[<từ khóa 1>,<từ khóa 2>,…] -Danh sách tên đối tượng, thuộc tính, hàm, quan hệ
dsten:=[<đối tượng>,<thuộc tính>,<tên quan hệ>,…] -Danh sách đối số của hàm, quan hệ, phép toán
dsdoiso:=[<kiểu đối tượng>, < kiểu đối tượng >, …] -Danh sách đối tượng
dsdoituong:=[A, B, …] -Danh sách kiểu đối tượng
dskieudt:=[<kiểu 1>, <kiểu 2>] -Danh sách các điều kiện của câu truy vấn:
dsdieukien:=[<dk1>,<dk>,…]
-Danh sách các kiểu tương ứng với các điều kiện của câu truy vấn: dskieudk:=[<kieudk1>,<kieudk2>,…]
Ví dụ 4.8: Nếu chuyển vị của hai ma trận bằng nhau thì chúng có bằng nhau không ?
?IS A = B WHERE A: MA_TRAN, B:MA_TRAN WITH {A^T =
B^T};
dsdoituongQ:=[A,B]
dskieudoituongQ:=[“MA_TRAN”, “MA_TRAN”] dssukienQ:=[{A^T = B^T},{A=B}]
dskieusukienQ:=[[sk5],[sk4]]
Ví dụ 4.9: Ma trận là gì ?
?WHAT CONCEPT MA_TRAN;
dstukhoa:=[“WHAT CONCEPT”] dsten :=[“MA_TRAN”]
dsdoiso :=[]
Thủ tục 2: Thủ tục LoaiTruyVan dùng để xác định câu truy vấn thuộc loại
nào.
Input: chuỗi câu truy vấn
Output: loại câu truy vấn loaiQ.
Gọi hàm: LoaiTruyVan(chuoitruyvan)
Ý tưởng:
Nếu chuỗi câu truy vấn chứa “IS” thì loaiQ = 1;
Ngược lại, nếu chuỗi câu truy vấn chứa “WHAT PROPERTY” thì loaiQ = 3; Ngược lại, nếu chuỗi câu truy vấn chứa “WHAT HYPOTHESIS” hay
“WHAT GOAL” thì loaiQ = 4; Ngược lại loaiQ = 2;
Input: chỉ số luật, danh sách đối tượng, danh sách kiểu và danh sách sự kiện của câu truy vấn có tên lần lượt: dsdoituongQ, dskieuQ, dssukienQ.
Output: TRUE/FALSE.
Gọi hàm: KiemTra(chisoluat, dsdoituongQ, dskieuQ, dssukienQ) Thủ tục này cần kiểm tra:
-Số lượng đối số của luật <= số lượng đối số của bài toán.
-Kiểu dữ liệu các đối số của luật phải trùng hoặc ít hơn kiểu dữ liệu đối số của câu truy vấn
-Số sự kiện của luật <= số sự kiện của biểu thức điều kiện câu truy vấn.
Nếu các điều kiện trên đều thỏa thì kết quả trả về là TRUE, ngược lại là FALSE.
Thủ tục 4: Thủ tục KieuSuKien
Input: chuỗi câu điều kiện.
Output: một trong 11 loại sự kiện và 2 loại quan hệ.
Gọi hàm: KieuSuKien(sukien)
Thủ tục này nhận diện xem điều kiện đang xét thuộc loại nào: sk1, sk2, sk3, sk4, sk5, sk6, sk7, sk8, sk9, sk10, sk11. Trong đó, sk1..sk11 tương ứng với các loại sự kiện từ 1 đến 11; sk6 có hai trường hợp riêng là: quan hệ “<>” (sk6_1) và quan hệ “<” (sk6_2).
Thủ tục 5: Thủ tục HopNhat
Input: sự kiện 1, sự kiện 2. Output: TRUE/FALSE.
Gọi hàm: HopNhat(sukien1, sukien2)
Thủ tục HopNhat để kiểm tra tính hợp nhất của hai sự kiện sk1 và sk2. Tính
hợp nhất của hai điều kiện được định nghĩa như sau:
sukien1 và sukien2được gọi là hợp nhất nếu thỏa hai điều sau: (1) sukien1 và sukien2 cùng kiểu (nghĩa là kieu1=kieu2)
(2) TH1: sukien1= sukien2, nếu sukien1 và sukien2 có kiểu: sk1, sk2, sk7, sk6_2.
TH2: nếu dk1 và dk2 có kiểu sk6 thì:
[dk1[1],{op(dk1[2..nops(dk1)])}] = [dk2[1],{op(dk2[2..nops(dk2)])}],.
TH3: lhs(sukien1)=lhs(sukien2) and rhs(sukien1)=rhs(sukien2) hoặc
lhs(sukien1)=rhs(sukien2) and rhs(sukien1)=lhs(sukien2)
nếu sukien1 và sukien2 thuộc một trong các kiểu: sk3, sk4, sk5, sk8, sk9, sk10, sk11, sk6_1.