背景 我不太了解prolog,但我一直在玩一个STRIPS计划概念(块的世界),它直接在SWI-PL终端查询计划时自行工作。我正在尝试创建一个到SWI-Prolog http服务器的Web界面,并希望将目标状态和初始状态作为查询字符串参数传递给Prolog服务器,但似乎查询字符串参数被视为字符串而不是真的是一个术语列表。
到目前为止我有什么: 以下关于http://www.pathwayslms.com/swipltuts/html/的示例我已经能够创建和HTTP服务器并在端口9999启动它,它使用url接受目标状态和初始状态:
http://localhost:9999/block_plan?init=[clear(2),clear(4),clear(b),clear(c),on(a,1),on(b,3),on(c,a)]&goal=[on(a,b)]
但是我收到服务器500错误:全局堆栈。现在我认为这是因为Initial和Goal变量是字符串而不是真正的术语,因为如果忽略plan(Init,Goal,P,F)
连接并将其替换为plan([clear(2), clear(4), clear(b), clear(c), on(a,1), on(b,3), on(c,a)],[on(a,b)], Plan, FinState)
,则服务器会以正确的计划进行响应。
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_parameters)).
:- use_module(library(uri)).
:- http_handler(root(block_plan), get_block_planner_solution, []).
server(Port) :-
http_server(http_dispatch, [port(Port)]).
get_block_planner_solution(_Request) :-
format('content-type: text/plain~n~n'),
http_parameters(_Request, [ init(Init,[optional(false)]),
goal(Goal,[optional(false)])
]),
format('Content-type: text/html~n~n', []),
format('<html><div>~n', []),
format('<div>Start State: ~w </div>~n', Init),
format('<div>Goal State: ~w </div>~n', Goal),
% plan([clear(2), clear(4), clear(b), clear(c), on(a,1), on(b,3), on(c,a)],[on(a,b)], Plan, FinState),
plan(Init,Goal,P,F),
format('<div>Plan: ~w </div>~n~n', [P]),
format('<table border=1>~n', []),
print_request(_Request),
format('~n</table>~n',[]),
format('</html>~n', []).
print_request([]).
print_request([H|T]) :-
H =.. [Name, Value],
format('<tr><td>~w<td>~w~n', [Name, Value]),
print_request(T).
问题是我如何获取输入Initial和Goal并将它们转换为可以传递给STRIPS计划者的正确术语列表?
如果这种方法不是最佳方法,我可以接受任何其他建议,将Web UI与SWI prolog规划器连接。
答案 0 :(得分:1)
好吧,昨晚我敲了它,我想我找到了解决自己问题的方法。基本思想是使用 StackOverflowException
将查询字符串转换为原子列表,然后创建处理原子列表的谓词,该谓词调用 atomic_list_concat/3
< / strong>在每个原子上构建一个新列表。
示例:
atom_to_term/2