Prolog 序言后置处理程序

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([], [

我对Prolog还很陌生,我对POST有一些问题。 这是我的序言形式:

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), * 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).
请将此更改为我们可以尝试的最小和完整的示例!这可能有助于您更好地了解正在发生的事情:@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), * 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). answer('/game', Request) :- format("Content-type: text/plain~n~n"), maplist(portray_clause, Request).