我正在构建基于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).
的(;)/ 2似乎是工作(显然是一个错误,否则)。顺便说一下,规则的身体周围的parens不需要 – CapelliC