標籤:style color 資料 io for 問題
GENI的核心 -- 推理機(5)處理why問題
1、why問題由客戶從瀏覽器提出
專家系統工作時,需要向使用者提出問題,收集推理求證用的事實根據。
使用者有時想知道,系統為什麼提出這樣的問題,要求系統給出解釋。這就是所謂的why問題。
why問題的提出,是按動網頁按鈕“why”的結果。
2、why功能的設定
GENI的第一個頁面default.htm並沒有按鈕“why”。它的設定過程是這樣的:
從上一節的謂詞check第3子句說起。
check( RNO, HISTORY, [CNO|REST] ):-cond(CNO,TEXT,OPTIONS),!,inpq(HISTORY,RNO,CNO,TEXT,OPTIONS).
這時的cond是未經求證的條件,即不存在yes(CNO)和no(CNO)的事實,於是,開始求證子目標inpq。
inpq(HISTORY,RNO,CNO,TEXT,OPTIONS)
inpq(HISTORY,RNO,CNO,TEXT,_):- whymeet,!,gen_why(HISTORY,RNO,TEXT,CNO),endpage_Why(),exit. inpq(_HISTORY,_RNO,CNO,TEXT,""):-!, write("\nIs it true that: ",TEXT,"\n<BR>"),format(CONDSTR,"cond_%",CNO),endpage(CONDSTR), exit. inpq(_HISTORY,_RNO,CNO,TEXT,FILENAME):-is_htmlfile(FILENAME),!, consult_htm(FILENAME,HtmlText), gethtmlbody(HtmlText,BodyText), write(BodyText),write("\nIs it true that: ",TEXT,"\n<BR>"),format(CONDSTR,"cond_%",CNO),endpage(CONDSTR),!,exit. inpq(_HISTORY,_RNO,CNO,TEXT,PICTURE):- write("\nIs it true that: ",TEXT," ",PICTURE,"\n"),format(CONDSTR,"cond_%",CNO),endpage(CONDSTR),!,exit.
Inpq的第1子句,處理why問題,產生專門網頁。下面將有介紹。
Inpq的第2、3、4子句,共同之處,都設定了進一步的提問求證和why功能。不同之處,只是顯示網頁的方法各異。
why功能的實際設定,在謂詞endpage。
endpage(CONDITION)
Endpage前面已有介紹,不再重複囉嗦。只是強調一下其第2子句中,設定why問題。
writef("<Input type=\"BUTTON\" value=\"Why\" onclick=\"form.%s.value=‘why‘;submit()\">\n",CONDITION),
CONDITION的值為cond_X,X是數字。假設X=15,在按鈕“why”後,form.cond_15.value=‘why’。
這一變數,決定了whymeet進入事實庫。
whymeet進入事實庫
前面小節中已經介紹過,cond_15=why這種CGI資料,會整理成parm(“cond_15”,”why”)這種樣子。
經過GOAL的assert_conditions求證,來到assert_cond(“cond_15”,”why”)的求證:
assert_cond(CNO,"yes"):-!,assert(yes(CNO)). assert_cond(CNO,"no"):-!,assert(no(CNO)). assert_cond(_CNO,"why"):-!,assert(whymeet). assert_cond(_,_):-errorexit.
第3子句,將whymeet存入事實庫。
3、why問題的處理
上述謂詞inpq的第1子句,負責處理why問題。
inpq(HISTORY,RNO,CNO,TEXT,_):- whymeet,!,gen_why(HISTORY,RNO,TEXT,CNO),endpage_Why(),exit.
事實whymeet的存在,說明使用者在瀏覽器按下了按鈕“why”,提出了這個問題。往下接著看gen_why和endpage_Why。
gen_why(HISTORY,RNO,TEXT,CNO)
gen_why(HISTORY,RNO,_TEXT,_CNO):-write("Why<BR>\n"),rule( RNO, Mygoal1, Mygoal2, _ ,_),!,sub_cat(Mygoal1,Mygoal2,Lstr),concat("I try to show that: ",Lstr,Lstr1),concat(Lstr1,"<BR>\nBy using rule number ",Ls1),str_int(Str_num,RNO),concat(Ls1,Str_num,Ans),show_rule(RNO,Lls1), concat(Ans,Lls1,Ans1),report(HISTORY,Sng),concat(Ans1,Sng,Answ),write(Answ),nl. gen_why(_HISTORY,_RNO,_TEXT,_CNO):-errorexit.
show_rule和report,以及endpage_Why都是外建謂詞,主要用於顯示網頁的內容,不再介紹。其餘的內建謂詞,前面幾節有過介紹,不再重複。
一點建議
直到寫完小節(10),才發現VIP的目錄EXAMPLES裡有單機版的GENI。
由於沒有CGI處理HTML顯示等問題,程式邏輯簡單許多,更適合學習研究。