SWI-Prolog の CGI ライブラリで input type="hidden" フォームを渡す際に問題があります。具体的には、次のことを行います。
<form id="frmCGIPrologIni" name="frmCGIPrologIni" method="post" action="http://localhost/cgi-bin/x.pl"> <p><input type="hidden" name="initial" value="ini" /> <input class="submit" type="submit" value="Start" /> </p></form>
プログラム x.pl が呼び出すとき、cgi_get_form(Arguments)
引数は Name(Value) 用語のリスト、つまり [Name, Value] である必要があるため、[initial(ini)] である必要があります。
しかし、これを使用すると、エラー: =../2: 引数が十分にインスタンス化されていません
print_args([]).
print_args([F|T]) :- % with Arguments
F =.. [Name, Value], % and should continue doing things
write(Arguments) を使用して手動で印刷しようとしましたが、得られるものは:_L160
で、最初の要素の印刷は:_G472
で、 write_canonical(Arguments) は次を返します:'.'(_,_)
チェックのためだけに method="get" も使用してみましたが、URI が正しく出力されるhttp://localhost/cgi-bin/x.pl?initial=ini
ので、送信の問題ではなく、cgi_get_form(Arguments) での処理の問題だと思います。
「http://localhost/cgi-bin/x.pl」を初めて実行するときは、次のようにします。
cgi_get_form(Arguments),
(Arguments = []) ->
(
format('<p>Print this as the index.</p>~n', []),
) ; true, % and it works well because there are no Arguments the first time
write('<p>'), write(Arguments), write('</p>'), nl, % and print other things
問題は2回目。今回は同じプログラムを呼び出して引数があるため、メッセージは出力されません。ここまではすべて問題ありません。その後、true を通過して続行します。そこで、前に説明した結果 ( ) を使用して (引数) を書き込もうとします_L160
。結果は、フォームから渡されたデータである必要があります。
問題は何ですか?