我正在構建基於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).
的(;)/ 2似乎是工作(顯然是一個錯誤,否則)。順便說一下,規則的身體周圍的parens不需要 – CapelliC