- Bài toán được lưu trữ theo cấu trúc như sau begin_exercise
4.4.2 Quá trình đi tìm lời giả
Giai đoạn 1: Xét tính giải được và tìm lời giải (nếu có) cho bài toán.
Bước 1: Ghi nhận thông tin của bài toán theo mô hình mạng các C –
Object :
Params :={}; // tập các tham biến (có thể rỗng).
Objects := []; // tập các đối tượng được đề cập trong bài toán. Obj_Types := []; // tập các kiểu tương ứng của các đối tượng trên. OAttrs := []; // tập các thuôc tính liên quan của các đối tượng
trong Objects được xem xét trong bài toán.
OAttr_Types :=[]; // tập các kiểu tương ứng của các thuộc tính trên. Funcs :={}; // tập các hàm được đề cập trong bài toán.
Func_Types :=[]; // tập các kiểu tương ứng của các hàm nêu trên, được lưu trữ trong file FUNCTIONS.txt hay trong biến Fun_Names. Functions :={}; // tập các sự kiện liên quan đến hàm, là các sự kiện
loại 7, 8, 9, 10 và 11.
Fact_Kinds :=[{},…,{}]; // tập các sự kiện đã được phân loại.
Hypos := {}; // tập các sự kiện giả thiết, bằng Facts ∪ Functions. Goals :=[]; // tập các sự kiện mục tiêu.
Bước 2: Khởi tạo.
FactSet := Hypos; // Hypos là tập giả thiết của bài toán Found := false; // Found = true khi bài toán giải được
Sol := []; // lưu các bước giải, có cả những bước giải thừa
flag := false; // flag = true khi có phát sinh sự kiện mới dem := 0; // số lần thêm đối tượng mới
DFi, Testi :={}; // lưu các hàm, luật, sự kiện đã xử lý.
Bước 3: Kiểm tra mục tiêu
if Test_Goal(Goal, FactSet) thenreturn (“Không cần giải”). else thực hiện bước 4.
Hàm Test_Goal(Goal, FactSet) dùng để kiểm tra Goal có là tập con của FactSet hay không, tương ứng với việc mục tiêu đã được tìm thấy hay chưa. Nếu như ban đầu mục tiêu đã được xác định thì bài toán không cần giải.[9]
Bước 4: Thực hiện một quá trình dò tìm cách suy diễn tính toán bằng
cách sử dụng các heuristic và các bước giải cơ bản để phát sinh hay suy ra sự kiện mới..
while not Found and flag do
flag := false; // đặt trạng thái không có sự kiện mới sinh ra.
<4.1> Áp dụng bước giải suy ra các sự kiện loại 2 từ các sự kiện loại 3.
Deduce_From3s (); // {sk loại 3}{ sk loại 2}
if flag thenFound := Test_Goal(Goal, FactSet); next; fi;
<4.2 > Áp dụng bước giải suy ra sự kiện mới loại 3 từ các sự kiện loại 3 và loại 4 bằng cách thế sự kiện loại 3 vào sự kiện loại 4. Deduce_From43s(); // {sk loại 3,4}{sk 3}
<4.3> Áp dụng bước giải suy ra sự kiện mới loại 3, 4 hay 5 từ các sự kiện loại 3 và 5 bằng cách thay thế các sự kiện loại 3 vào sự kiện loại 5.
Deduce_From53s(); // {sk loại 3,5}{sk 3,4,5} .
if flag thenFound := Test_Goal(Goal, FactSet); next; fi;
<4.4 > Từ các sự kiện loại 4 vả 5, giải hệ phương trình để được các sự kiện mới loại 3.
Deduce_From45s(); // {sk loại 4,5}{sk 3} .
if flag then Found := Test_Goal(Goal, FactSet); next; fi;
<4.5> Sinh ra sự kiện loại 7 từ sự kiện loại 8.
Deduce_From8s(); // {sk loại 8}{sk loại 7}.
if flag then Found := Test_Goal(Goal, FactSet); next; fi;
<4.6> Từ sự kiện loại 9 và một sự kiện loại 3(hay loại 8) suy ra sự kiện mới loại 3(hay 8) bằng cách thế sự kiện loại 3(hay 8) đã biết vào sự kiện 9.
Deduce_From983s(); //{sk loại 3(hay8), sk9}{sk loại 3(hay8)}.
if flag then Found := Test_Goal(Goal, FactSet); next; fi;
<4.7> Thực hiện dò tìm cách suy diễn tính toán bên trong mỗi đối tượng.
Deduce_Objects(); // giải bên trong từng đối tượng.
if flag then Found := Test_Goal(Goal, FactSet); next; fi;
<4.8 > Suy ra các sự kiện mới từ sự kiện loại 9 bằng cách thực hiện tính toán hàm.
Deduce_From9s(); // {sk loại 9}{sk loại 2, 3, 6, 7, 8}.
if flag then Found := Test_Goal(Goal, FactSet); next; fi;
<4.9> Dò tìm luật suy diễn có thể áp dụng được trên tập sự kiện FactSet.
Deduce_Rules ();
if flag then Found := Test_Goal(Goal, FactSet); next; fi;
<4.10> Sử dụng heuristic để tìm kiếm hàm có thể áp dụng được trên tập sự kiện loại 2 và thực hiện tính toán hàm để sinh sự kiện mới
Deduce_Funcs();
if flag then Found := Test_Goal(Goal, FactSet); next; fi;
<4.11>Thiết lập các phương trình từ các sự kiện đang có để giải và sinh ra các sự kiện mới.
Deduce_Eqs(); // giải phương trình.
if flag then Found := Test_Goal(Goal, FactSet); next; fi;
<4.12> Thêm đối tượng mới
Sau khi áp dụng các bước giải trên, nếu không có sự kiện mới sinh ra mà có phát sinh các đối tượng mới (ObjsNew <>[], FactNew<>0 ) thì :
if dem < = 2 then
+ Thêm đối tượng mới vào trong tập đối tượng Objects đã có và thêm những sự kiện đi cùng với đối tượng mới vào Fact_Kinds, FactSet.
+ Đồng thời tăng biến đếm(dem:=dem+1). Chương trình chỉ cho phép phát sinh đối tượng mới đến đời thứ 2.
+ flag := true; // đặt trạng thái có phát sinh sự kiện mới.
fi;
<4.13>if (tìm kiếm ở các bước trên thất bại ) then break; (ngắt vòng lặp while)
fi; end while:
Xét trong mỗi Deduce:
Gọi <news> là tập chứa các sự kiện mới sinh ra, khởi tạo ban đầu với news :=[].
Trong khi dò tìm dạng suy luận có thể áp dụng được trên tập FactSet, if có phát sinh sự kiện mới (news<>{}) then
+ Lưu lại hàm, luật hay sự kiện đã xử lý để tránh trường hợp lặp lại ở những bước tìm kiếm sau.
+ Phân loại sự kiện mới rồi cập nhật lại FactSet, Fact_Kinds như sau: for ex in news do
k := Kind_Fact(ex);
if k>=1 and k<=11 and not Unify_In1(ex,FactSet) then Fact_Kinds[k] :=[op(Fact_Kinds[k]),ex];
FactSet:=FactSet union {ex}; fi;
end for;
// trong đó, hàm Kind_Fact(ex) dùng để phân loại sự kiện ex(có tổng cộng 11 loại sự kiện) và hàm Unify_In1(ex, FactSet) dùng để kiểm tra xem sự kiện ex đã có tồn tại trong tập FactSet chưa.
+ Gọi <f> là dạng luật áp dụng được trên tập sự kiện <fset>⊂<FactSet>, sinh ra sự kiện mới <news>. Cập nhật các biến như sau:
Sol:=[op(Sol),[“tên bước giải”, f , fset, news ]]; // lưu bước giải mới
flag:=true; // đặt tình trạng có phát sinh sự kiện mới.
Bước 5:
If Found then “Bài toán giải được” Else “ Bài toán không giải được”.
Giai đoạn 2: Thể hiện lời giải Bước 1: Khởi tạo
Goalvars := {Goal}; // Tập các sự kiện cần được suy ra, bắt đầu từ mục tiêu.
Solnew := []; // Lời giải hoàn chỉnh.
Bước 2:
Thực hiện quá trình truy ngược theo lời giải <Sol> ban đầu, đi từ mục tiêu trở vể giả thiết, xem xét và trích lọc ra những bước giải nào là thật sự cần thiết, cần được giữ lại trong lời giải để cuối cùng được một lời giải hoàn chỉnh và tối ưu nhất.
for i from nops(Sol) to 1 by -1 do
Step:=Sol[i];
if Step[4] ∩ goalvars ≠∅then
Step[4] := Step[4] ∩ goalvars; Solnew := [Step, op(Solnew)];
goalvars := (goalvars - Step[4]) ∪ Step[3];
fi; od;
Xuất phát từ mục tiêu, ta xem xét các bước giải trong <Sol> để tìm xem những sự kiện nào có thể dẫn ra được mục tiêu và sự kiện này sẽ được xem xét như là mục tiêu mới cho các bước truy ngược tiếp theo.
Quá trình này kết thúc khi tất cả các mục tiêu phát sinh đều đã được biết hay thuộc giả thiết.