python 3 - Clipspy模块使用

一、clipspy安装:

Clipspy底层是基于clips规则引擎开发、支持python3的一个模块,在python3的工程中,可以通过调用clipsy的API接口实现clips规则引擎。

在线安装:

pip install clipspy

python 3 - Clipspy模块使用_第1张图片

当出现Successfully installed字样时,表示安装成功。

离线安装:

手动去pypi官网下载clipspy模块的whl包:

网址:clipspy · PyPI

根据自己的python版本及平台选择对应的文件进行下载:

python 3 - Clipspy模块使用_第2张图片

然后执行以下命令:

后面clipspy-1.0.0-cp39-cp39-win_amd64.whl需根据自己下载的whl包修改。

pip install clipspy-1.0.0-cp39-cp39-win_amd64.whl

二、官方文档:

官方网站:CLIPS Python bindings — clipspy 1.0.0 documentation

clips规则引擎手册:https://clipsrules.sourceforge.io/documentation/v640/apg.pdf

clipspyAPI手册:CLIPS — clipspy 1.0.0 documentation

三、实践:

字符串编写规则,浅试一手:

# !/usr/bin/python3.9
# -*- coding: utf-8 -*-
# @Time: 2022/9/15 10:32
# @Author: [作者名]
# @E-mail: [邮箱]
# @FileName: test.py
# @Software: PyCharm

import clips


def send_msg(msg):
    print("send_msg " + msg)
    pass


myclips = clips.Environment()

# 清除规则
myclips.clear()

# 注册函数  Define the Python function within the CLIPS environment.
myclips.define_function(send_msg)

# 建立规则:通过?实现取参和传参,具体匹配后的操作可在send_msg函数里进行设置
# 也可以将规则都写入一个clp文件中,通过myclips.load("文件名")来加载
conditionstr = """
(defrule my-rule
  (my-fact ?first-slot)
  =>
  (send_msg  ?first-slot))
"""

# 建立规则
myclips.build(conditionstr)

# 清空事实列表
myclips.reset()

# 断言事实
myclips.assert_string("(my-fact test)")
# class clips.facts.Template assert_fact

# 执行引擎,返回激活的次数,int,可以通过比较该返回的int值,来确定匹配到了几条规则,规则是否具有唯一性
myclips.run()

文件编写规则:

rule.clp文件:

(defrule one-rule
  (my-fact 打电话)
  =>
  (send_msg  你想打给谁?)
)

(defrule two-rule
  (my-fact 打给)
  (who ?who)
  =>
  (send_msg  好的,现在拨号给 ?who)
)

(defrule three-rule
  (my-fact 谁最可爱)
  =>
  (send_msg  当然是你呀)
)

(defrule four-rule
  (my-fact 谢谢)
  =>
  (send_msg  不用客气!)
)

主程序:

# !/usr/bin/python3.9
# -*- coding: utf-8 -*-
# @Time: 2022/9/15 10:32
# @Author: [作者名]
# @E-mail: [邮箱]
# @FileName: test.py
# @Software: PyCharm
# 在CLIPS里,以"=>"符号为分界,分别叫Left-hand side (LHS),right-hand side(RHS)。可以叫左端,右端。

import clips

def send_msg(*msgs):
    result = ''
    for msg in msgs:
        result = ''.join([result, msg])
    print("sirin:" + result)
    pass

myclips = clips.Environment()

# 清除规则
myclips.clear()

# 注册函数  Define the Python function within the CLIPS environment.
myclips.define_function(send_msg)
# 也可以将规则都写入一个clp文件中,通过myclips.load("文件名")来加载

# 建立规则
myclips.load("rule.clp")

s = input("siri:请问有什么可以帮到你呢?\n我:")

while True:
    # 清空事实列表
    myclips.reset()
    # 用户输入问题

    if "打给" in s:
        myclips.assert_string("(my-fact 打给)")
        myclips.assert_string("(who %s)" % s[2:])
    else:
        myclips.assert_string("(my-fact %s)" % s)
    # class clips.facts.Template assert_fact

    # 执行引擎,返回激活的次数,int,可以通过比较该返回的int值,来确定匹配到了几条规则,规则是否具有唯一性
    result = myclips.run()

    if result == 0:
        print("siri:抱歉,我听不懂你在说什么。")

    s = input("我:")

执行结果:

python 3 - Clipspy模块使用_第3张图片

clp规则文件中是根据clips要求的规则语法来书写的,如果想要让业务人员能够更加看懂以及自行添加规则,可以开发一套新的规则文件的书写语法,然后在程序中进行转换。

你可能感兴趣的:(python,python)