我正在为一个处理电路的作业编写CLIPS程序。我使用Protege创建了我的本体,并从中生成了clp文件并将其加载到CLIPS中。结果如下:
(defclass systemEntity (is-a USER) (role abstract) (single-slot suspect (type SYMBOL) (allowed-values yes no) (default no) (create-accessor read-write)) (single-slot out (type INTEGER) (range 0 31) (create-accessor read-write)))(defclass command (is-a systemEntity) (role concrete))(defclass component (is-a systemEntity) (role abstract))(defclass sensor (is-a component) (role concrete) (single-slot theoretical (type INTEGER) (create-accessor read-write)) (single-slot out (type INTEGER) (range 0 31) (create-accessor read-write)) (single-slot reading (type INTEGER) (range 0 31) (create-accessor read-write)) (single-slot input (type INSTANCE) (allowed-classes internal-component) (create-accessor read-write)))(defclass internal-component (is-a component) (role concrete) (single-slot short-out (type INTEGER) (range 0 0) (default 0) (create-accessor read-write)) (multislot output (type INSTANCE) (allowed-classes component) (create-accessor read-write)) (single-slot msb-out (type INTEGER) (range 0 15) (create-accessor read-write)) (single-slot input2 (type INSTANCE) (allowed-classes systemEntity) (create-accessor read-write)) (single-slot input1 (type INSTANCE) (allowed-classes systemEntity) (create-accessor read-write)))(defclass adder (is-a internal-component) (role concrete))(defclass multiplier (is-a internal-component) (role concrete))(defclass circuit (is-a systemEntity) (role concrete) (multislot outputs (type INSTANCE) (allowed-classes sensor) (create-accessor read-write)) (multislot has-components (type INSTANCE) (allowed-classes component) (create-accessor read-write)) (multislot inputs (type INSTANCE) (allowed-classes command) (create-accessor read-write)))(defclass data (is-a USER) (role abstract) (single-slot clock (type INTEGER) (range 1 ?VARIABLE) (create-accessor read-write)) (single-slot object (type INSTANCE) (allowed-classes systemEntity) (create-accessor read-write)) (single-slot value (type INTEGER) (create-accessor read-write)))(defclass command_data (is-a data) (role concrete) (single-slot object (type INSTANCE) (allowed-classes command) (create-accessor read-write)))(defclass reading_data (is-a data) (role concrete) (single-slot object (type INSTANCE) (allowed-classes sensor) (create-accessor read-write)))(definstances facts ([a1] of adder (input1 [input_1]) (input2 [input_1]) (output [m1] [p1]) (short-out 0) (suspect no))([a2] of adder (input1 [p1]) (input2 [p2]) (output [out1]) (short-out 0) (suspect no))([circuit_1] of circuit (has-components [m1] [m2] [m3] [out1] [a1] [a2] [p1] [p2]) (inputs [input_1] [input_2] [input_3] [input_4]) (outputs [out1]) (suspect no))([command_1_inp1] of command_data (clock 1) (object [input_1]) (value 21))([command_1_inp2] of command_data (clock 1) (object [input_2]) (value 28))([command_1_inp3] of command_data (clock 1) (object [input_3]) (value 10))([command_1_inp4] of command_data (clock 1) (object [input_4]) (value 25))([input_1] of command (suspect no))([input_2] of command (suspect no))([input_3] of command (suspect no))([input_4] of command (suspect no))([m1] of sensor (input [a1]) (suspect no))([m2] of sensor (input [p1]) (suspect no))([m3] of sensor (input [p2]) (suspect no))([out1] of sensor (input [a2]) (suspect no))([p1] of multiplier (input1 [input_2]) (input2 [a1]) (output [m2] [a2]) (short-out 0) (suspect no))([p2] of multiplier (input1 [input_3]) (input2 [input_4]) (output [m3] [a2]) (short-out 0) (suspect no))([reading_1_m1] of reading_data (clock 1) (object [m1]) (value 10))([reading_1_m2] of reading_data (clock 1) (object [m2]) (value 24))([reading_1_m3] of reading_data (clock 1) (object [m3]) (value 26))([reading_1_out] of reading_data (clock 1) (object [out1]) (value 18)))
我正在尝试弄清楚如何创建defrules来打印出特定类实例(如adder a1)的所有输入和输出。我将通过展示一些definstances来说明我的意思:
([a1] of adder (input1 [input_1]) (input2 [input_1]) (output [m1] [p1]) (short-out 0) (suspect no))
a1 adder的input1和input2是input_1实例,即:
([command_1_inp1] of command_data (clock 1) (object [input_1]) (value 21))
输出到m1和p1,可以通过m1实例获取输出,即:
([reading_1_m1] of reading_data (clock 1) (object [m1]) (value 10))
然而,当我尝试访问实例的值(例如第一个输入的值)时,我得到了一个错误No object of existing classes can satisfy is-a restriction in object pattern.
(defrule find-input-1 (object (is-a command_data) (clock ?clock) (value ?value)) => (printout t ?clock " " ?value crlf))
我做错了什么?我如何访问我的实例所具有的值?
回答:
您需要在规则中使用object关键字,否则CLIPS会将internal-component视为deftemplate事实处理。
(defrule print-sensor (object (is-a internal-component) (input1 ?input1) (input2 ?input2)) => (printout t ?input1 " " ?input2 crlf))
您还需要将internal-component类声明为响应性,以便在规则中使用它。
(defclass internal-component (is-a component) (role concrete) (pattern-match reactive) . . .)