Prolog 應用-多重文件欄位連動關係

2009-01-01

在一次企業架構(Enterprise Architecture)學術研討會中,一位學者花了許多功夫找出 DoDAF(Department of Defense Architecture Framework)各產品文件間重要欄位之連動關係。

也就是說,當需要修正 DoDAF 某產品文件中之某欄位時,也必須同時修正其他一或數個產品文件中之其他欄位。

引用 Kenming Wang 圖

他十分自豪地介紹自創 63*63 欄位連動關係陣列,可以幫助正在導入或維護 DoDAF 產品文件者,使能更方便地更準確地更動資料。
當時作為聽眾的我,直覺地認為應該有比使用陣列查找更簡便之法。我考慮了一下,決定使用人工智慧語言 Prolog 來解決 DoDAF 產品文件間重要欄位之連動關係。

Prolog 語法簡述:

  • %% 是程式註釋,Prolog 不會處理。
  • Prolog 每一敘述均以 " . " 結尾。
  • 首先建立所有 “事實"(Fact)做為後續 “推論"(Predicate)之資料。
    • 可以用任何自認有說明意義之字串,做為某種 “事實"。
    • 至於 “事實" 在真實世界中代表何意,Prolog 並不關心。
    • “事實" 就是說明某些資料群之間有某種關係。
  • 然後制定所有 “規則"(Rule)為後續 “推論"(Predicate)賦予智能。
    • 可以用任何自認有說明意義之字串,做為 “規則"  名稱。
    • :- 代表以下為 “規則"。
    • “規則" 與 “規則" 之間," , " 代表 “AND"," ; " 代表 “OR"。
    • 用 “規則" “推論" 智能。
  • Prolog 有許多內建功能,還能調用 C 程式,功能十分強大。

Prolog 是解決各式複雜關聯問題不二法門,其程式甚為簡單易懂,說明如下:

程式列表
%% 假定: 文件 A 中有 3 個欄位 A1/A2/A3 %%
keyword(field_A1, doc_A).
keyword(field_A2, doc_A).
keyword(field_A3, doc_A).

%% 假定: 文件 B 中有 3 個欄位 B1/B2/B3 %%
keyword(field_B1, doc_B).
keyword(field_B2, doc_B).
keyword(field_B3, doc_B).

%% 假定: 文件 C 中有 3 個欄位 C1/C2/C3 %%
keyword(field_C1, doc_C).
keyword(field_C2, doc_C).
keyword(field_C3, doc_C).

%% 假定: 文件 A 欄位與文件 B 欄位 連動關係如下 %%
related(field_A1, field_B3).
related(field_A2, field_C1).
related(field_A3, field_B2).

%% 假定: 文件 B 欄位與文件 C 欄位 連動關係如下 %%
related(field_B1, field_C2).
related(field_B2, field_C3).

%% 連動關係具有交換律 %%
co_related(X, Y):-
	related(Y, X).

%% 連動關係 %%
associate(X, Y, Z):-
	(related(X, Y);co_related(X, Y)),
	keyword(Y, Z).
作業系統
編譯命令 gplc -o DoDAF DoDAF.pl
執行命令 ./DoDAF
查詢條件
列出所有連動關係 associate(X, Y, Z).
列出 欄位=B2 所有連動關係 associate(field_B2, Y, docA).
列出 文件 A 所有連動關係 associate(X, Y, Z).

那位學者只需要把文件欄位及連動關係列入 Prolog 事實部份,剩下的就讓 Prolog 做它應該做的事 – 人工智慧。
使用 Prolog 是否比查找 63*63 陣列更方便呢? 🙂

廣告
%d 位部落客按了讚: