Prolog 序言后置处理程序
我对Prolog还很陌生,我对POST有一些问题。 这是我的序言形式:Prolog 序言后置处理程序,prolog,swi-prolog,Prolog,Swi Prolog,我对Prolog还很陌生,我对POST有一些问题。 这是我的序言形式: form([action='/game', method='POST'], [ p([], [ label([for=fromX],'From X'), input([name=fromX, type=textarea]) ]), p([], [
form([action='/game', method='POST'], [
p([], [
label([for=fromX],'From X'),
input([name=fromX, type=textarea])
]),
p([], [
label([for=fromY],'From Y'),
input([name=fromY, type=textarea])
]),
p([], [
label([for=toX],'To X'),
input([name=toX, type=textarea])
]),
p([], [
label([for=toY],'To Y'),
input([name=toY, type=textarea])
]),
p([], input([name=submit, type=submit, value='Submit'], []))
])
这是我的处理程序:
answer('/game', Request) :-
memberchk(search(Search), Request),
memberchk(toX=ToX, Search),
memberchk(toY=ToY, Search),
memberchk(fromX=FromX, Search),
memberchk(fromYy=FromY, Search),
whiteTurn(ToX/ToY, FromX/FromY, White_N),
game_page(White_N).
当我点击提交按钮时,我得到
内部服务器错误目标意外失败
有人能帮助我如何使这个处理器正常工作吗?现在我只需要将数据从表单转到whiteTurn
函数,稍后我将处理其他异常
下面是一个可执行的示例,有相同的错误:
:- use_module(library('http/thread_httpd')).
:- use_module(library('http/html_write')).
:- use_module(library('http/http_session')).
:- use_module(library('http/http_error')).
server :-
server(3000).
server(Port) :-
http_server(answer,
[ port(Port),
timeout(20)
| []
]).
answer(Request) :-
memberchk(path(Path), Request),
answer(Path, Request).
answer(/, _Request) :-
title_page.
answer('/game', Request) :-
memberchk(search(Search), Request),
memberchk(toX=ToX, Search),
memberchk(toY=ToY, Search),
memberchk(fromX=FromX, Search),
memberchk(fromYy=FromY, Search),
whiteTurn(ToX/ToY, FromX/FromY, White_N),
game_page(White_N).
title_page:-
reply_html_page(
title('Draughts'),
[
h1('Draughts'),
form([action='/game', method='POST'], [
p([], [
label([for=fromX],'From X'),
input([name=fromX, type=textarea])
]),
p([], [
label([for=fromY],'From Y'),
input([name=fromY, type=textarea])
]),
p([], [
label([for=toX],'To X'),
input([name=toX, type=textarea])
]),
p([], [
label([for=toY],'To Y'),
input([name=toY, type=textarea])
]),
p([], input([name=submit, type=submit, value='Submit'], []))
])
]).
whiteTurn(X/Y, A/B, WHITE_N):-
WHITE = [ 2/1,4/1,6/1,8/1,
1/2,3/2,5/2,7/2,
2/3,4/3,6/3,8/3],
M = [ 1/1,2/1,3/1,4/1,5/1,6/1,7/1,8/1,
1/2,2/2,3/2,4/2,5/2,6/2,7/2,8/2,
1/3,2/3,3/3,4/3,5/3,6/3,7/3,8/3,
1/2,2/2,3/2,4/2,5/2,6/2,7/2,8/2,
1/4,2/4,3/4,4/4,5/4,6/4,7/4,8/4,
1/5,2/5,3/5,4/5,5/5,6/5,7/5,8/5,
1/6,2/6,3/6,4/6,5/6,6/6,7/6,8/6,
1/7,2/7,3/7,4/7,5/7,6/7,7/7,8/7,
1/8,2/8,3/8,4/8,5/8,6/8,7/8,8/8 ],
( member(X/Y, M), (X =:= A + 1; X =:= A - 1), Y =:= B - 1,
member(A/B, WHITE) ->
delete(WHITE, X/Y, WHITE_M), WHITE_N is [A/B|WHITE_M];
WHITE_N = WHITE ).
game_page(White_N):-
reply_html_page(
title('Draughts'),
[
h1('Draughts'),
form([action='/game', method='POST'], [
p([], [
label([for=fromX],'From X'),
input([name=fromX, type=textarea])
]),
p([], [
label([for=fromY],'From Y'),
input([name=fromY, type=textarea])
]),
p([], [
label([for=toX],'To X'),
input([name=toX, type=textarea])
]),
p([], [
label([for=toY],'To Y'),
input([name=toY, type=textarea])
]),
p([], input([name=submit, type=submit, value='Submit'], []))
])
]).
要在Prolog程序中找到故障的确切原因,请使用强大的声明性调试技术 为此,请将以下定义添加到程序中: :- op(950,fy, *). *_. 我使用删除线字体表示,在阅读此代码段时,可以简单地放弃目标 如果您现在使用这样修改的程序进行尝试,它将成功 不过,很明显,该程序现在过于笼统了 所以,你可以通过系统地重新介绍你已经概括的目标,使它更具体 这是第一个镜头: answer('/game', Request) :- memberchk(search(Search), Request), *
请将此更改为我们可以尝试的最小和完整的示例!这可能有助于您更好地了解正在发生的事情:@mat我用相同的方法添加了代码的可执行示例error@ScottHunter谢谢,我会查看的谢谢你们的建议,但我的主要问题是我不知道如何从我的post表单中获取变量并将它们放入whiteTurn语句中。现在我知道他们甚至没有被要求,但不知道为什么。我在互联网上寻找解决方案,但没有找到。没有一个简单的解决方法可以做到这一点。我想出来了,我必须使用GET方法而不是POST,然后我可以将我的数据传递到其他页面。感谢您的帮助,您的代码对发现我的错误很有帮助:-)使用
POST
方法完全可以,在某些情况下甚至是必要的或更好的。但是,您需要以不同的方式处理请求,请参阅。要处理POST
请求,您只需添加:-使用_模块(库(http/http\u客户端))。
并使用http\u读取_数据(请求,数据,[])
获取数据
中的Var=Value
对列表。另请参见以简化调度。而且,[a,b |[]]
与[a,b]
相同。
answer('/game', Request) :-
memberchk(search(Search), Request),
*