Взаимодействие с движком правил Clips на Python

Я хотел бы несколько раз пообщаться с механизмом правил Clips в Python 3.8.3.

Например, я хотел бы получить следующее сообщение

  1. Запустить клипы
    C:\Users\username\Clips>"C:\Program Files\CLIPS 6.31\CLIPSDOS64.exe"
             CLIPS (6.31 6/12/19)
  1. Определить правила
    (defrule ValueManipulation
      (value ?v)
    =>
      (assert (result ?v))
    )
  1. Запрос с первым набором фактов и чтение результатов из стандартного вывода
    (deffacts f1 "My facts" (value 1))
    (reset)
    (run)
    (facts)
  1. Запрос со вторым набором фактов и чтение результатов из стандартного вывода
    (deffacts f1 "My facts" (value 2))
    (reset)
    (run)
    (facts)
  1. Выход
    (exit)

Мне удалось ввести один раз в стандартный ввод и один раз прочитать из стандартного вывода:

import subprocess

clips_commands = """
(defrule ValueManipulation
  (value ?v)
=>
  (assert (result ?v))
)
(deffacts f1 "My facts" (value 1))
(reset)
(run)
(facts)
(exit)
"""
p = subprocess.Popen('"C:\Program Files\CLIPS 6.31\CLIPSDOS64.exe"', 
                     stdin=subprocess.PIPE, stdout=subprocess.PIPE)
result = p.communicate(input=bytes(clips_commands,'utf-8'))

for line in str(result[0]).split('\\r\\n'):
    print(line)

Однако я хотел бы несколько раз запросить следующий вид и прочитать вывод из stdout

    (deffacts f1 "My facts" (value 3))
    (reset)
    (run)
    (facts)

Использование пакетов вроде pyclips или же clipspy не был предпочтительным в приведенном выше примере, потому что эти пакеты не были доступны с pip install. Однако переупаковка одного из этих пакетов может решить вопрос.

1 ответ

Благодаря @noxdafox я смог использовать clipspy библиотека!

Ниже приведен тестовый код, демонстрирующий правила повторного использования клипов:

import clips

env = clips.Environment()

rule = """
(defrule ValueManipulation
  (value ?v)
=>
  (assert (result ?v))
)
"""
env.build(rule)

print('Add fact 1:')
env.assert_string("(value 1)")
for fact in env.facts():
    print(fact)
env.run()
print('\nResult for fact 1:')
for fact in env.facts():
    print(fact)

print('\nFacts after reset:')
env.reset()
for fact in env.facts():
    print(fact)
env.assert_string("(value 2)")

print('\nResult for fact 2:')
env.run()
for fact in env.facts():
    print(fact)

print('\nResult for fact 3:')
env.reset()
env.assert_string("(value 3)")
env.run()
for fact in env.facts():
    print(fact)

Приведенный выше код дает следующие результаты:

Add fact 1:
(initial-fact)
(value 1)

Result for fact 1:
(initial-fact)
(value 1)
(result 1)

Facts after reset:
(initial-fact)

Result for fact 2:
(initial-fact)
(value 2)
(result 2)

Result for fact 3:
(initial-fact)
(value 3)
(result 3)
Другие вопросы по тегам