2016-08-31 2 views
0

私はswiplを使用しています。下のparts.plデータベースファイルをWebページから照会しようとしていますが、どのようにクエリを投稿し、データベースに「クエリ」してそれらの結果を返すかわかりません。プロローグのWebページからプロログデータベースを照会するにはどうすればいいですか?

例えば、私ができると思っているのは、 'part(jeep、100、A、B)'のようなswiplコマンドラインのようにクエリを入力することだけです。同じ結果がページに戻ってきました。

誰でもこれを行う方法に関する少しの指針を与えることができます。これまでに私が得たことがここにあります。

:- use_module(library(http/thread_httpd)). 
:- use_module(library(http/http_dispatch)). 
:- use_module(library(http/http_error)). 
:- use_module(library(http/html_write)). 
:- use_module(library(http/http_client)). 

:- use_module(parts). 

:- http_handler('/', my_query_form, []). 

server(Port) :- 
    http_server(http_dispatch, [port(Port)]). 

my_query_form(Request) :- 
    reply_html_page(
     my_style, 
     [title('My Test')], 
     [\page_content(Request)]). 

page_content(_Request) --> 
    html(
     [ 
     form([action='/landing', method='POST'], [ 
      p([], [ 
       label([for=model], 'Model '), 
       input([name=model, type=textarea]) 
        ]), 
      p([], [ 
       label([for=major], 'Major '), 
       input([name=major, type=textarea]) 
        ]), 
      p([], [ 
       label([for=minor], 'Minor '), 
       input([name=part, type=textarea]) 
        ]), 
      p([], input([name=submit, type=submit, value='Search'], [])) 
     ])]). 

:- http_handler('/landing', landing_pad, []). 

landing_pad(Request) :- 
    member(method(post), Request), !, 
    http_read_data(Request, Data, []), 
    format('Content-type: text/html~n~n', []), 
    format('<p>', []), 
    portray_clause(Data), 
    format('</p<p>=======~n', []), 
    portray_clause(Request), 
    format('</p>'). 

:- multifile 
    user:body//2. 

user:body(my_style, Body) --> 
    html(body([ 
     div(id(top), h3('Parts Query')), 
     div(id(beta), p(i('(beta)'))), 
     div(id(content), Body) 
     ])). 

これは私のparts.plファイルです。

:- module(parts,[part/4]). 
% part(model, major, minor, description). 
part(jeep, 100, 1000, 'description of 100-1000'). 
part(jeep, 100, 1001, 'description of 100-1001'). 
part(jeep, 100, 1002, 'description of 100-1002'). 
part(jeep, 101, 1000, 'description of 101-1000'). 
part(jeep, 101, 1001, 'description of 101-1001'). 
part(jeep, 101, 1002, 'description of 101-1002'). 
part(ford, 101, 1000, 'description of 101-1000'). 

アップデート:(私の最新の実際に問い合わせを行いますが、データベース全体を返す)

landing_pad(Request) :- 
    member(method(post), Request), !, 
    http_read_data(Request, Data, []), 
    format('Content-type: text/html~n~n', []),  
    format('<p>', []), 
    memberchk(model=Model, Data), 
    findall(p(Model, Major, Minor, Description), 
     part(Model, Major, Minor, Description), Descriptions), 
    maplist(description, Descriptions), 
    format('</p>'). 

description(p(M,A,I,D)) :- format("~q ~q:~q - ~q</br>", [M,A,I,D]). 
+0

あなたはすでにあなた自身で遠くに印象的に取得することができました。私はちょうどあなたがサーバーコードで 'part/4'を呼んでいるところは見ません....あなたの質問にこれを置くのを忘れましたか? –

+0

@Ender:最新の編集には、クエリ全体が失敗する間違いが含まれています。また、これを修正しても、**データベース全体を返さない**。これをさらに詳しくチェックしてください。あなたの例の要素が、あなたが項目を分かりやすく伝えるような方法で選択されているなら、間違いなく助けになるでしょう。 – mat

答えて

1

あなたは極めて近くにあります。

実際にはデータベースに、指定されたコンポーネントが含まれています。私はあなたにこのクエリの一部を与え、運動と休息を記入のまま:

 
landing_pad(Request) :- 
    member(method(post), Request), !, 
    http_read_data(Request, Data, []), 
    format('Content-type: text/html~n~n', []), 
    format('<p>', []), 
    memberchk(model=Model, Data), 
    findall(p(Major,Description), part(Model, Major, _, Description), Descriptions), 
    maplist(description, Descriptions), 
    format('</p>'). 

私は大胆に新しいパーツを強調しています。

findall/3は、すべての一致する部分を収集します。この場合、フォームデータからModelコンポーネントのみが使用されます。あなたは残りを記入することができます。説明を表示するには

、あなたは、例えば使用することができます。

description(p(M,D)) :- format("<p>~q: ~q</p>\n", [M,D]). 

description/1の定義として。

ヒント:フォーマット指定子~qの使用に注意してください。デバッグがずっと楽になります。整数とアトムを区別する必要があるため、クエリの一部として追加の機能を追加すると、意味がわかります。

+0

ありがとうございます。少なくとも私はデータベース全体を返していますが、少なくとも私は照会することができます。 – Ender

+0

@Ender Prologのトップレベルは、選択肢点を扱う非常に特殊な方法を持っています(さらなる回答のために ';'を押してください)。あなたはウェブページ上の返信の文脈でこれをどう対処するかを決める必要があります。インスピレーションのために[SWISH](http://swish.swi-prolog.org/)を使うことができます。 –

+0

@Ender:データベース全体を返さない**: 'jeep'を挿入すると、' mode = jeep'が保持する6つのエントリだけが返されます。 'ford'を挿入すると、' ford'の1つのエントリだけを返します。 – mat

関連する問題