我正在建立一个基于Luger& amp;的专家系统shell。 Stubblefield的ExShell。在他们的系统中,他们以下列方式定义规则:
rule((Goal :- (Premise)), CF_Rule).
忽略CF_Rule。此语法的一个示例是:
rule((fix(Advice) :-
(bad_component(X),fix(X, Advice))), 100).
我想在某些规则中添加OR,但是SWI-Prolog不会识别&#34 ;;"只是跳过规则,就像它有一个错字。例如,如果我想这样做:
rule((fix(Advice) :-
(bad_component(X); fix(X, Advice))), 100).
然后该规则不再被识别。由于shell是如何构建的(它不会触发具有相同头部的两个目标),因此定义两个规则不是一个选项。如何在这些规则中添加OR?
编辑: 系统从编写
开始solve(fix(X), CF).
Solve查找要触发的规则,然后尝试解决它们的前提,如下所示:
%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).
答案 0 :(得分: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.