序言规则作为参数
prolog rules as arguments
我正在构建一个基于 Luger & Stubblefield 的 ExShell 的专家系统 shell。在他们的系统中,他们按以下方式定义规则:
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).
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).
至少在 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.
我正在构建一个基于 Luger & Stubblefield 的 ExShell 的专家系统 shell。在他们的系统中,他们按以下方式定义规则:
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).
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).
至少在 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.