Я вызываю swi-пролог из php, отправляю вопрос и получаю результат. я использую Exec () функция для этого:
$goal = "all_facts('S').";
$cmd = "/software/swipl/bin/swipl -f Domain.pl -g ".$goal." -t halt";
Предикат all_facts () возвращает факты о графствах, в этом примере — квадрат.
Есть много фактов о странах на русском языке в файле пролога, как это нужно для моего сайта.
SWI-пролог возвращает ответ с русскими символами и все в порядке.
Проблема возникает, когда я пытаюсь использовать русские символы в запросе, например:
$goal = "all_facts('Столица').";
Тогда я запускаю этот запрос именно в SWI-прологе, я получаю правильный ответ. Но тогда я спрашиваю это от php, я не получаю ответ вообще.
Так что, я думаю, при отправке запроса появляются ошибки, а swi-пролог получает искаженный вопрос, поэтому не может найти ответ.
Я уже изменил кодировку SWI-Prolog (используя переменную окружения LANG), кодировку страницы, попытался изменить кодировку php exec (не уверен, работает ли он).
Возможно, мне действительно нужно изменить кодировку php exec, но я делаю это неправильно.
Пожалуйста помоги!
На всякий случай, часть файла пролога:
facts('Австралия','S', 7686850).
facts('Австрия', 'S', 83871).
facts('Азербайджан','S', 86600).
facts('Австралия','Столица', 'Канберра').
facts('Австрия', 'Столица', 'Вена').
facts('Азербайджан','Столица', 'Баку').
all_facts(C):- findall(X:Y, facts(X,C,Y), All), write(All).
Код PHP:
<?
$goal = "all_facts('Столица').";
$cmd = "/software/swipl/bin/swipl -f Domain.pl -g ".$goal." -t halt";
if (exec($cmd)) {$output = exec($cmd);}
else {echo "Error!";}
$output = str_replace(array("[","]"), "", $output);
$facts = explode(",", $output);
$length = count($facts);
echo "<ul>";
for ($i=0; $i<$length; $i++) {
$all_facts[$i]= explode(":", $facts[$i]);
echo "<li>",$all_facts[$i][0], " - " ,$all_facts[$i][1],"</li>";
}
echo "</ul>";
?>
Основываясь на обсуждении комментариев, я предлагаю вам добавить на первая строка из Domain.pl
подать следующую директиву:
:- encoding(utf8).
и убедитесь, что текстовый редактор, используемый для редактирования файла, сохраняет его как файл UTF-8. Ваша модифицированная версия all_facts/1
Предикат теперь должен написать utf8
,
Других решений пока нет …