我从php调用swi-prolog,发送问题并获得结果。我使用 exec()函数:
$goal = "all_facts('S').";
$cmd = "/software/swipl/bin/swipl -f Domain.pl -g ".$goal." -t halt";
谓词 all_facts()会返回有关县的事实,在本例中为square。
我的网站需要prolog文件中有很多关于俄语国家的事实。 SWI-prolog用俄语符号返回一个答案,每件事都没问题。
当我在请求中尝试使用俄语符号时,问题就出现了,例如:
$goal = "all_facts('Столица').";
然后我正好在SWI-prolog中运行这个请求,我得到了正确的答案。但是我从php那里问它,我根本得不到答案。
所以,我猜,发送请求时会出现错误,并且swi-prolog会出现扭曲的问题,因此无法找到答案。
我已经改变了SWI-Prolog的编码(使用环境变量LANG),页面编码,试图改变php exec的编码(不确定,如果它有效)。 也许,我真的需要改变php exec编码,但做错了。
请帮忙!
以防万一,prolog文件的一部分:
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>";
?>
答案 0 :(得分:0)
根据对评论的讨论,我建议您在Domain.pl
文件的第一行添加以下指令:
:- encoding(utf8).
并确保用于编辑文件的文本编辑器将其保存为UTF-8文件。您修改后的all_facts/1
谓词版本现在应该写为utf8
。