【问题标题】:Is there a way to allow only unique values for slots in CLIPS有没有办法只允许 CLIPS 中插槽的唯一值
【发布时间】:2017-09-04 05:27:04
【问题描述】:
(deftemplate Employee
   (slot employee-id)
   (slot employee-name)
   (slot Role)
   (slot Designation))

(deffacts Employees
   (employee (employee-name X) (employee-id 1) (Role CS) (Designation TA))
   (employee (employee-name Y) (employee-id 2) (Role CS) (Designation SA))
   (employee (employee-name Z) (employee-id 3) (Role CIS) (Designation TA))
   (employee (employee-name W) (employee-id 4) (Role SE) (Designation SA))
   (employee (employee-name Q) (employee-id 5) (Role CIS) (Designation TA))
   (employee (employee-name U) (employee-id 1) (Role CS) (Designation TA)))

在上面的示例中,我输入了两次员工 ID。如何将员工 ID 定义为唯一的?

【问题讨论】:

    标签: oop clips expert-system


    【解决方案1】:
    CLIPS> (defglobal ?*id* = 0)
    CLIPS> 
    (deffunction next-id ()
       (bind ?*id* (+ ?*id* 1)))
    CLIPS> 
    (deftemplate employee
       (slot employee-id (default-dynamic (next-id)))
       (slot employee-name)
       (slot Role)
       (slot Designation))
    CLIPS> 
    (deffacts Employees
       (employee (employee-name X) (Role CS) (Designation TA))
       (employee (employee-name Y) (Role CS) (Designation SA))
       (employee (employee-name Z) (Role CIS) (Designation TA))
       (employee (employee-name W) (Role SE) (Designation SA))
       (employee (employee-name Q) (Role CIS) (Designation TA))
       (employee (employee-name U) (Role CS) (Designation TA)))
    CLIPS> (reset)
    CLIPS> (facts)
    f-0     (initial-fact)
    f-1     (employee (employee-id 1) (employee-name X) (Role CS) (Designation TA))
    f-2     (employee (employee-id 2) (employee-name Y) (Role CS) (Designation SA))
    f-3     (employee (employee-id 3) (employee-name Z) (Role CIS) (Designation TA))
    f-4     (employee (employee-id 4) (employee-name W) (Role SE) (Designation SA))
    f-5     (employee (employee-id 5) (employee-name Q) (Role CIS) (Designation TA))
    f-6     (employee (employee-id 6) (employee-name U) (Role CS) (Designation TA))
    For a total of 7 facts.
    CLIPS> 
    

    【讨论】:

    • 这里它自动生成序列。它不应允许您使用现有员工 ID 输入事实。
    • 写一条规则删除id重复的员工,或者使用事实查询函数判断是否有员工存在id并递增?*id*直到找到唯一值,或者使用gensym*生成唯一 id,或创建调用 C 以生成 UUID 的用户定义函数。
    • 这是有道理的。谢谢..!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2013-01-08
    • 2023-02-03
    • 2020-02-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多