使用动态插槽名称来修改函数

问题描述 投票:0回答:1

在 CLIPS 中,

modify
函数不能被赋予动态槽名称,是有意还是疏忽。

; This compiles and works.
(deffunction set_tpl_value(?addr ?key ?val)
    (modify ?addr (the-slot ?val)))

; This gives a syntax error, at position: (?key
(deffunction set_tpl_value(?addr ?key ?val)
    (modify ?addr (?key ?val)))
clips
1个回答
0
投票

CLIPS 最初是由一名合作学生在 1985 年花费几个月时间开发的原型。此后我接手并在 NASA 工作了 11 年,并在我离开后继续支持公共领域版本。

大部分初始工作都集中在使 CLIPS 可用且可维护。源代码由多个文件组成,以便于编辑,但必须将这些文件连接在一起作为单个文件进行编译。代码中有些地方有几十层嵌套的 if/while/for 语句。因此,我做的第一件事就是将源代码拆分并组织成可以单独编译的文件,并重构函数,以便我能够理解它们在做什么。该代码最初是在 HP-9000 上开发的,因此我致力于通过在 VAX 11/780 和 IBM PC 上编译它来使其可移植。原始原型中没有 Read-Eval-Print-Loop,因此添加了一个,以便开发人员可以与 CLIPS 代码进行交互和调试。

当 CLIPS 首次在 IBM PC 上运行时,它实际上以每分钟一条的速度执行由几十条规则组成的小程序中的规则。该代码存在大量内存泄漏和不必要的计算。 rete算法的实现效率低下。在模式匹配过程中,模式中遇到的变量被添加到变量值的链表中,该变量值将与其他链表进行比较,以确定模式之间的变量绑定是否一致——两个模式各有 5 个变量,即使有 5 个变量,也会导致 25 次比较。两个列表之间没有共同的变量。直到 CLIPS 4.2,CLIPS 中才有了相当有效的 rete 算法实现。

Deftemplates 直到 1989 年 CLIPS 4.3 发布时才添加。它们在功能上等同于 OPS5 中的literalize 语句。底层事实仍然是有序事实,因此 deftemplate 具有与 OPS5 字面化相同的限制:deftemplate 中仅限于一个多字段槽,因为多字段槽位置始终放置在有序事实的末尾,因此多字段值是始终是有序事实中的最后一个槽位置加上任何多余的值。

已经过去了 35 年,但可能当时我没有考虑让插槽名称动态化,因为我没有编写任何需要这种灵活性的程序,所以我没有想到这一点。 deftemplate 真正最大的好处是能够仅指定感兴趣的槽,并且 deffunctions 直到 1991 年的 5.0 版本才添加,因此没有一种机制可以通用化可以在规则之间共享的代码。当我的同事 Brian Dantes 将 COOL 添加到 5.0 版本中,然后在 1993 年与 6.0 版本中的规则完全集成后,就没有太多需要向 deftemplates 添加一些功能,因为 COOL 是一种经过深思熟虑的面向对象的实现编程语言。

© www.soinside.com 2019 - 2024. All rights reserved.