prolog规则作为参数

时间:2015-06-16 03:52:46

标签: prolog artificial-intelligence expert-system

我正在建立一个基于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).

1 个答案:

答案 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.