序言规则作为参数

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.