2016-12-06 4 views
0

Фон: Я не очень-то знаю про пролог, но я играл с концепцией планировщика STRIPS (мир блоков), который работает сам по себе при запросе план непосредственно в терминале SWI-PL. Я пытаюсь создать веб-интерфейс для HTTP-сервера SWI-Prolog и хотел бы передать состояние цели и начальное состояние в качестве параметров строки запроса на сервер 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 и цель и преобразовать их в соответствующие списки терминов, которые могут быть переданы от планировщика ПОЛОСКИ?

Если этот подход не является оптимальным подходом, я открыт для любых других предложений по взаимодействию с веб-интерфейсом с помощью прологи-планировщика SWI.

ответ

0

Хорошо, я забил прошлой ночью, и я думаю, что нашел решение своего вопроса. Основная идея состоит в том, чтобы преобразовать строку запроса в список атомов с помощью atomic_list_concat/3, а затем создать предикат, который обрабатывает список атомов, который вызывает atom_to_term/2 на каждом атоме, создавая новый список.

Пример:

get_block_planner_solution(_Request) : 
http_parameters(_Request, [ init(InitString,[optional(false),string]), 
          goal(GoalString,[optional(false),string]) 
       ]), 
atomic_list_concat(InitL, ;,InitString), 
atomic_list_concat(GoalL, ;,GoalString), 
process_atoms(InitL,TermListi), 
process_atoms(GoalL,TermListg), 
plan(TermListi,TermListg,P,F), 
format('Content-type: text/html~n~n', []), 
format('<html><div>~n', []), 
format('<div>Start State: ~w </div>~n', [InitL]), 
format('<div>Goal State: ~w </div>~n', [GoalL]), 
format('<div>Plan: ~w </div>~n~n', [P]), 
format('<div>TermListI: ~w</div>~n',[TermListi]), 
format('<div>TermListG: ~w</div>~n',[TermListg]), 
format('<table border=1>~n', []), 
print_request(_Request), 
format('~n</table>~n',[]), 
format('</html>~n', []). 

process_atoms([],[]). 

process_atoms([H|T], [HT|RT]) :- 
     atom_to_term(H,PT,Bindings), 
     HT = PT, 
     process_atoms(T, RT). 

 Смежные вопросы

  • Нет связанных вопросов^_^