You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CLIPSPy中使用列表变更事实?我尝试循环实现却失败

用列表和for循环批量处理CLIPS事实的实现方案

我尝试通过列表配合for循环来批量变更CLIPS事实,但多次尝试都没成功。我的思路是给每个模板的变量创建对应列表,再用循环处理,但代码没生效。我当前的Python代码如下:

import clips

DEFTEMPLATE_DORMITORIO = """
(deftemplate Dormitorio
    (slot Presencia (type SYMBOL))
    (slot Iluminación (type SYMBOL)))
"""

DEFTEMPLATE_SALADEESTAR = """
(deftemplate SalaDeEstar
    (slot Presencia (type SYMBOL))
    (slot Iluminación (type SYMBOL)))
"""

DEFTEMPLATE_GENERALES = """
(deftemplate Generales
    (slot Hora (type INTEGER)))
"""

env = clips.Environment()
env.build(DEFTEMPLATE_DORMITORIO)
env.build(DEFTEMPLATE_SALADEESTAR)
env.build(DEFTEMPLATE_GENERALES)
env.load('reglas2.CLP')

Dormitorio = env.find_template('Dormitorio')
fact_Dormitorio = Dormitorio.assert_fact(Presencia = clips.Symbol('Si'),
                                         Iluminación = clips.Symbol('OFF'))

SalaDeEstar = env.find_template('SalaDeEstar')
fact_SalaDeEstar = SalaDeEstar.assert_fact(Presencia = clips.Symbol('Si'),
                                           Iluminación = clips.Symbol('OFF'))

Generales = env.find_template('Generales')
fact_Generales = Generales.assert_fact(Hora = 2100)

env.run()            
for facts in env.facts():
    
    print(facts)

批量创建事实的优化方案

要实现批量创建CLIPS事实,你可以把模板定义和事实数据整理成结构化列表,通过循环统一处理,避免重复的模板查找和断言代码:

import clips

# 批量存储所有模板定义
DEFTEMPLATES = [
    """
    (deftemplate Dormitorio
        (slot Presencia (type SYMBOL))
        (slot Iluminación (type SYMBOL)))
    """,
    """
    (deftemplate SalaDeEstar
        (slot Presencia (type SYMBOL))
        (slot Iluminación (type SYMBOL)))
    """,
    """
    (deftemplate Generales
        (slot Hora (type INTEGER)))
    """
]

# 批量存储事实数据:每个元素为(模板名称, 事实参数字典)
FACT_DATA = [
    ("Dormitorio", {"Presencia": clips.Symbol('Si'), "Iluminación": clips.Symbol('OFF')}),
    ("SalaDeEstar", {"Presencia": clips.Symbol('Si'), "Iluminación": clips.Symbol('OFF')}),
    ("Generales", {"Hora": 2100})
]

env = clips.Environment()

# 循环构建所有模板
for template_def in DEFTEMPLATES:
    env.build(template_def)

env.load('reglas2.CLP')

# 循环断言所有事实
fact_list = []
for template_name, params in FACT_DATA:
    template = env.find_template(template_name)
    fact = template.assert_fact(**params)
    fact_list.append(fact)

env.run()

# 输出所有事实
for fact in env.facts():
    print(fact)

批量修改事实的注意事项

CLIPS中的事实是不可变对象,无法直接修改已断言的事实。要实现"修改"效果,必须先撤销原有事实,再断言新的事实。以下是批量修改的示例:

# 定义要更新的新事实数据
UPDATED_FACT_DATA = [
    ("Dormitorio", {"Presencia": clips.Symbol('No'), "Iluminación": clips.Symbol('ON')}),
    ("SalaDeEstar", {"Presencia": clips.Symbol('No'), "Iluminación": clips.Symbol('ON')}),
    ("Generales", {"Hora": 2200})
]

# 循环执行修改:撤销旧事实 + 断言新事实
for idx, (template_name, new_params) in enumerate(UPDATED_FACT_DATA):
    # 撤销原有事实
    fact_list[idx].retract()
    # 断言新事实
    template = env.find_template(template_name)
    new_fact = template.assert_fact(**new_params)
    fact_list[idx] = new_fact

env.run()

# 输出修改后的事实
print("\n修改后的事实:")
for fact in env.facts():
    print(fact)

内容的提问来源于stack exchange,提问作者FernandoRT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:30:49