我正在尝试编写一个 prolog 服务器,以便能够从用另一种编程语言(Python、JavaScript 等)编写的客户端查询用 prolog 编写的知识库,就像 SQL 数据库一样。
我原以为这是一件很常见的事情,但我在网上找不到任何例子。
所有必需的套接字函数似乎都列在https://www.dcc.fc.up.pt/~vsc/Yap/documentation.html#Sockets上,我使用 yap 而不是 swi-prolog 的原因是我想要使用 Unix 套接字,而不是 TCP/IP 套接字。但我将在这里使用 AF_INET,因为 swi-prolog 不支持 AF_UNIX。
编写一个从客户端写入字符串的服务器很容易:
#!/usr/bin/yap -L --
:- initialization(main).
main :-
socket('AF_INET', Socket),
socket_bind(Socket, 'AF_INET'('localhost', 1234)),
socket_listen(Socket, 2),
socket_accept(Socket, _Client, Stream),
read(Stream, Term),
write(Term),
socket_close(Socket).
我使用的简单 Python 3 客户端如下所示:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 1234))
sock.send(b"'Hello World\n'")
sock.close()
棘手的地方是让服务器将字符串回显给客户端,据我所知,这需要 socket_select/5 。但是我从可用的文档中不知道如何使用它。