2015-06-16 50 views
2

我正在构建基于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). 
+1

的(;)/ 2似乎是工作(显然是一个错误,否则)。顺便说一下,规则的身体周围的parens不需要 – CapelliC

回答

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. 
+0

奇怪的是,它不适合我。必须是shell触发规则或某处的错误的方式。不管怎么说,多谢拉。 –

+0

你如何输入这些规则? – dlask