Как использовать PyCLIPS для интерактивных сессий? - PullRequest
0 голосов
/ 12 декабря 2018

Мой файл клипа содержит (printout t"text") и bind ?var (read) операторов.Если я запускаю файл .clp из кода C, приведенного ниже, программа печатает на консоль и считывает мой ввод с консоли, как и ожидалось, что делает его интерактивным сеансом между программой и пользователем.

#include "clipscpp.h"
#include <iostream>
#include<stdlib.h>
using namespace std;
int main()
  {
   CLIPS::CLIPSCPPEnv theEnv;

   theEnv.Load("KB.clp");
   theEnv.Reset();
   theEnv.Run(-1);
   return 0;
  }

Но, еслиЯ пытаюсь загрузить .clp в python, используя PyCLIPS, ни (printout), ни (read) не работают, и программа завершает работу, ничего не делая.

import clips
clips.Load("KB.clp")
clips.Clear()
clips.Reset()
clips.Run(-1)

Как мне добиться того же результата, что и при запуске из C?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Я бы предложил что-то вроде этого:

def parse_trace_stream(trace_stream):
    ...
    """Print trace_stream"""
def parse_stdout_stream(stdout_stream):
    ...
    """Print stdout_stream"""
def parse_error_stream(error_stream):
    ...
    """Print error_stream"""

def evaluate(str):
    if str.count("(") == str.count(")"):
        try:
            clips.Eval(str)
        except:
            parse_error_stream(clips.ErrorStream.Read())

        parse_stdout_stream(clips.StdoutStream.Read())
        parse_trace_stream(clips.TraceStream.Read())

После этого вы можете написать более CLIPS-подобный код:

evaluate("(load KB.clp)")
evaluate("(clear)")
evaluate("(reset)")
evaluate("(run -1)")
0 голосов
/ 13 декабря 2018

FAQ по PyCLIPS (http://pyclips.sourceforge.net/web/?q=view/faq) предполагает, что вы используете функции Python для обработки ввода / вывода.

...