2015-06-16 86 views
2

我正在構建基於Luger的專家系統shell & Stubblefield的ExShell。在他們的系統中,他們按以下方式定義規則:prolog規則作爲參數

rule((Goal :- (Premise)), CF_Rule). 

忽略CF_Rule。此語法的一個示例是:

rule((fix(Advice) :- 
    (bad_component(X),fix(X, Advice))), 100). 

我想在某些規則中添加OR,但SWI-Prolog不識別「;」並跳過規則,就像它有一個錯字。例如,如果我想這樣做:

rule((fix(Advice) :- 
    (bad_component(X); fix(X, Advice))), 100). 

然後規則不再被識別。由於shell是如何構建的,所以定義兩條規則不是一個選項(它不會觸發具有相同頭部的兩個目標)。我如何在這些規則中添加OR?

編輯: 系統開始寫

solve(fix(X), CF). 

解決驗看規則觸發,然後試圖解決他們的前提,是這樣的:

%backchain on a rule in knowledge base 
solve(Goal, CF, Rules, Threshold) :- 
    rule((Goal :- (Premise)), CF_rule), 
    solve(Premise, CF_premise, 
     [rule((Goal :- Premise), CF_rule)|Rules], Threshold), 
    rule_cf(CF_rule, CF_premise, CF), 
    above_threshold(CF, Threshold). 

的頂層目標是啓動搜索是:

rule((fix(Advice) :- 
    (bad_component(X),fix(X, Advice))), 100). 
+1

的(;)/ 2似乎是工作(顯然是一個錯誤,否則)。順便說一下,規則的身體周圍的parens不需要 – CapelliC

回答

2

它的工作,至少在SWI-Prolog版本6。 6.6。

讓我們這兩個規則定義:

rule((fix(Advice) :- (bad_component(X), fix(X, Advice))), 100). 
rule((fix(Advice) :- (bad_component(X); fix(X, Advice))), 100). 

如果我們要求提供的規則,我們得到他們兩個:

?- rule((A :- B), C). 
A = fix(_G2329), 
B = (bad_component(_G2334), fix(_G2334, _G2329)), 
C = 100 ; 
A = fix(_G2329), 
B = (bad_component(_G2334);fix(_G2334, _G2329)), 
C = 100. 
+0

奇怪的是,它不適合我。必須是shell觸發規則或某處的錯誤的方式。不管怎麼說,多謝拉。 –

+0

你如何輸入這些規則? – dlask