CLIPS deftemplate 错误的插槽类型

詹姆士

我对 CLIPS 非常困惑。我在 .clp 文件中定义了一个 deftemplate 和一个规则。

(deftemplate basic-ch "Basic characteristics template"
    (slot ch-name
        (type SYMBOL)
        (default ?DERIVE)
    )
    (slot score
        (type INTEGER)
        (default 1)
        (range 1 5)
    )
)
(defrule make-ch
    ?get-ch <- (get-ch TRUE)
    =>
    (printout t "Enter ch name" crlf)
    (bind ?name (read))
    (printout t "Enter ch score" crlf)
    (bind ?score (read))
    (assert (basic-ch (ch-name ?name) (score ?score)))
    (retract ?get-ch)
)

当 i (assert (get-ch TRUE)) 和 (run) 时,它会提示我输入 ch 名称和分数。但是,如果我为分数输入字符串,则字符串分数会被规则断言!例如:

Enter ch name
hello
Enter ch score
hello
;(basic-ch (ch-name hello)(score hello)) get asserted?!

这怎么可能?我已将分数定义为整数,甚至提供了范围。我怎么能阻止这个?

加里·莱利

来自基本编程指南的第 11 节,约束属性:

支持两种类型的约束检查:静态和动态。启用静态约束检查后,会在解析函数调用和构造时检查约束违规。这包括当变量用于多个插槽时,规则的 LHS 上的模式之间的约束检查。启用动态约束检查后,新创建的数据对象(例如 deftemplate 事实和实例)会检查其槽值是否违反约束。本质上,静态约束检查发生在加载 CLIPS 程序时,而动态约束检查发生在 CLIPS 程序运行时。默认情况下,启用静态约束检查,禁用动态约束检查。可以使用 set-static-constraint-checking 和 set-dynamic-constraint-checking 函数更改默认行为。

如果启用动态约束检查,则在运行程序时会出现错误:

CLIPS> (set-dynamic-constraint-checking TRUE)
TRUE
CLIPS> (assert (get-ch TRUE))
<Fact-1>
CLIPS> (run)
Enter ch name
hello
Enter ch score
hello

[CSTRNCHK1] Slot value hello found in fact f-2     
does not match the allowed types for slot score.
[PRCCODE4] Execution halted during the actions of defrule make-ch.
CLIPS> 

因为它会产生错误,所以动态约束检查对测试很有用,但不适用于在程序执行时验证用户输入。如果要验证使用输入,请定义一些实用程序方法:

CLIPS> 
(defmethod get-integer ((?query STRING))
   (bind ?value FALSE)
   (while (not (integerp ?value))
      (printout t ?query " ")
      (bind ?value (read)))
   ?value)
CLIPS>  
(defmethod get-integer ((?query STRING) (?lower INTEGER) (?upper INTEGER))
   (bind ?value FALSE)
   (while (or (not (integerp ?value)) (< ?value ?lower) (> ?value ?upper))
      (printout t ?query " (" ?lower " - " ?upper ") ")
      (bind ?value (read)))
   ?value)
CLIPS> (get-integer "Pick an integer:")
Pick an integer: hello
Pick an integer: 3
3
CLIPS> (get-integer "Pick an integer" 1 5)
Pick an integer (1 - 5) -1
Pick an integer (1 - 5) hello
Pick an integer (1 - 5) 8
Pick an integer (1 - 5) 4
4
CLIPS> 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CLIPS - 从出生年份的插槽 deftemplate 打印学生的年龄 (defrule)

来自分类Dev

无法在CLIPS消息处理程序中引用继承的插槽

来自分类Dev

其他defmodules如何从MAIN导入defclass和deftemplate

来自分类Dev

在CLIPS中终止指令

来自分类Dev

CLIPS规则触发多次

来自分类Dev

CLIPS性能问题

来自分类Dev

CLIPS的开发循环

来自分类Dev

CLIPS验证文本输入

来自分类Dev

CLIPS条件规则

来自分类Dev

在 CLIPS 中获取议程

来自分类Dev

结果的重复 [CLIPS]

来自分类Dev

使用逻辑和在 CLIPS

来自分类Dev

如何在CLIPS中使程序断言用户输入而没有用户类型断言(无论如何)

来自分类Dev

如何在CLIPS中使程序断言用户输入而没有用户类型断言(无论如何)

来自分类Dev

CLIPS缺少模板的函数声明

来自分类Dev

如何使CLIPS程序正常工作?

来自分类Dev

CLIPS输入获取和比较

来自分类Dev

CLIPS 比较 2 个日期

来自分类Dev

在 CLIPS 中访问多个 (?) 值

来自分类Dev

C ++ Qt插槽错误

来自分类Dev

CLIPS从文件加载并运行程序

来自分类Dev

CLIPS中的逻辑OR-简单的除垢

来自分类Dev

检查if()CLIPS中的多个字段

来自分类Dev

如何推断Clips中的其他关系?

来自分类Dev

对CLIPS功能的误解。找不到正确的答案

来自分类Dev

在CLIPS中找到条件的最小值

来自分类Dev

在CLIPS中获取事实并打印参数

来自分类Dev

CLIPS中的时间和日期功能

来自分类Dev

CLIPS 打印输出规则触发次数