- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以我目前正处于构建游戏的开始阶段,我正在使用 prolog 作为游戏的服务器端来对棋盘中的游戏进行验证检查。
我现在有两个问题。
一:似乎无法在不中止的情况下关闭服务器,从而使套接字保持打开状态。代码如下
服务器:
:- use_module(library(socket)).
create_server(Port) :-
tcp_socket(Socket),
tcp_bind(Socket, Port),
tcp_listen(Socket, 5),
tcp_open_socket(Socket, AcceptFd, _),
dispatch(AcceptFd).
dispatch(AcceptFd) :-
tcp_accept(AcceptFd, Socket, Peer),
thread_create(process_client(Socket, Peer), _,
[ detached(true)
]),
dispatch(AcceptFd).
process_client(Socket, _Peer) :-
setup_call_cleanup(tcp_open_socket(Socket, In, Out),
handle_service(In, Out),
close_connection(In, Out)).
close_connection(In, Out) :-
close(In, [force(true)]),
close(Out, [force(true)]).
handle_service(In, Out) :-
read(In, Int),
writeln(Int),
( Int == end_of_file
-> true
;
call_test(Int,Term),
format(Out, 'seen(~q).~n', [Term]),
flush_output(Out),
handle_service(In, Out)
).
call_test(test,Term):-Term = 'really test'.
call_test(validate(teste),Term):-
String = "validate(test)",
string_to_list(String,List),
read_from_chars(List,Stringf),
writeln(Stringf),
Term = 'foo'.
客户:
:- use_module(library(streampool)).
create_client(Host, Port) :-
setup_call_catcher_cleanup(tcp_socket(Socket),
tcp_connect(Socket, Host:Port),
exception(_),
tcp_close_socket(Socket)),
setup_call_cleanup(tcp_open_socket(Socket, In, Out),
chat_to_server(In, Out),
close_connection(In, Out)).
chat_to_server(In, Out) :-
read(Term),
( Term == end_of_file
-> true
; format(Out, '~q .~n', [Term]),
flush_output(Out),
read(In, Reply),
write(Reply),
%format('Reply: ~q.~n', [Reply]),
chat_to_server(In, Out)
).
close_connection(In, Out) :-
close(In, [force(true)]),
close(Out, [force(true)]).
我可以使用 ctrl+D(即 end_of_file)毫无问题地关闭客户端,但我的服务器没有关闭...它接收 end_of_file,打印 end_of_file 但它没有关闭。甚至直接将其插入服务器时也不行。我做错了什么?
二:我需要将一个字符串从 C++ 传递给 Swipl,其中包含要使用的谓词名称和参数。有人可以告诉我该怎么做,或者至少为我指明正确的方向吗?
非常感谢。
最佳答案
Int == end_of_file
不应该是 Int = end_of_file
来检查统一吗?我在这里可能是错的,我使用 sicstus。
至于如何传递谓词名称和参数,类似这样的方法应该可行
call_test(Request, Answer) :-
Request = Pred(Arg1, Arg2, Arg3),
Request,
Answer = somethingHere.
然后在 C++ 中简单地做
//pseudo-code
write(socket, "myPredicate(myArg1, myArg2, myArg3).\n");
Prolog 会根据您的指示将传入的字符串转换为实际代码。另一种更通用的实现方式是
call_test(Request, Answer) :-
Pred =.. Request,
Pred,
Answer = somethingHere.
在 C++ 中
write(socket, "[myPredicate, Arg1, Arg2, Arg3].\n");
//supports variable number of args
关于c++ - Swipl 中的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13913182/
首先,我使用SWI-Prolog加载文件 $ swipl file.pl 然后我修改文件并保存。 现在我该如何重新加载文件 ?- reload 为此修改的file.pl? 最佳答案 为此,SWI-Pr
所以我目前正处于构建游戏的开始阶段,我正在使用 prolog 作为游戏的服务器端来对棋盘中的游戏进行验证检查。 我现在有两个问题。 一:似乎无法在不中止的情况下关闭服务器,从而使套接字保持打开状态。代
我想了解为什么与 swipl 的交互似乎不一致。 这是一个典型的例子。假设我查阅了包含以下定义的知识库: acc_max([H|T], A, Max) :- H > A, acc_max(T, H,
我正在寻找 swipl与 perl -e 相似的功能 特别是,我想以这种方式运行 prolog 代码: swipl --wanted-flag "fact(a). message:-writeln('
这个问题在这里已经有了答案: How to clear screen in SICStus Prolog (4 个答案) 关闭 7 年前。 当您在 Windows 中运行命令提示符时,您可以键入 c
我正在使用 SWI-Prolog 的命令行解释器 swipl。我在包含文件 test.pro 的目录中运行它,并尝试调用 [test.pro]. 这会导致 swipl 喷出 错误:语法错误:需要运算符
我正在使用 swipl.exe Windows 上的 Prolog REPL 并尝试使用 user pseudo file用 [user]. 打开但我想不出离开伪文件的快捷键: c:\code>swi
我是一名优秀的程序员,十分优秀!