Я пытаюсь использовать библиотеку подпроцесса python (3.8) для связи со swipl (интерпретатором Prolog). (Я использую MAC OSx)
Подробнее о Прологе: https://www.swi -prolog.org
Онлайн переводчик Пролога: https://swish.swi -пролог. org
Я хочу иметь возможность загружать кучу фактов и правил в базу знаний. Отдельно я хочу иметь возможность задать несколько вопросов переводчику, а затем получить ответ.
Я уже попробовал функцию связи, но она не удовлетворяет требованию возможности отправлять и получать данные несколько раз, поскольку линия связи закрыта после первого вызова.
Прямо сейчас, когда я запускаю программу, я думаю, что она загружается при записи, а затем, когда она попадает в stdout.read (), она запускает строку и затем останавливается. Не уверен, что именно происходит и как я могу получить вывод вызовов.
import os
import signal
import subprocess
# NOTE: stderr=subprocess.PIPE makes the swipl intro in terminal go away
p = subprocess.Popen('swipl', stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True, universal_newlines=True)
# The communicate() method returns a tuple (stdoutdata, stderrdata).
p.stdin.write('assert(car(honda, 18000, red)).')
p.stdin.write('assert(car(toyota, 18000, white)).')
p.stdin.write('assert(car(ford, 25000, red)).')
p.stdin.write('assert(car(acura, 50000, white)).')
p.stdin.write('assert(car(bmw, 60000, red)).')
p.stdin.write('[user]. recommendcar(Age, Car) :- Age =< 25, car(Car, Cost, red), Cost =< 30000 .')
p.stdin.write('recommendcar(20, X).')
output = p.stdout.read()
print(output)
p.kill()