2017-03-29 8 views
1

私はPrologを学んで遊んでいるだけで、情報のデータベースを構築し、自然な英語を使って関係について質問しています。これをどうやってやりますか?データベースに関するクエリを解析するためにDCGを作成するにはどうすればよいですか?

例:

%facts 

male(bob). 
female(sarah). 
male(timmy). 
female(mandy). 

parent(bob, timmy). 
parent(bob, mandy). 
parent(sarah, timmy). 
parent(sarah, mandy). 

spouse(bob, sarah). 
spouse(sarah, bob). 

%some basic rules 

married(X,Y) :- spouse(X,Y). 
married(X,Y) :- spouse(Y,X). 

child(C,X) :- parent(X,C). 

は、私はいくつかの「誰が」「ティミーの親である」質問、すなわちを、お願いしたいと思います。

私はDCGについて何かを読んだことがありますが、誰かが私に良いリソースを教えたり、正しい方向に向かうことができますか?

ありがとうございました!実際にが実際に親である

parent(X, Y). 

のような:

+2

このコメントの上の 'dcg'タグをクリックしてください。次に、右上に 'dcg'タグが再びあります。その右側に 'info'のリンクがあります。それをクリックしてください。情報ページには多くの良いリンクがあります。 –

+0

ありがとう! aaaaaaaa – prolog

答えて

1

まず、私はまた、「誰が」という質問をお願いしたいと思いますか?それはXですか、それともYですか?

これを明確にするために、各引数の意味を明確にする命名規則を使用することを強くお勧めします。たとえば:今すぐ

parent_child(X, Y). 

、Prologのゴールあなたのデータの上にその理由を「非公式」の質問を翻訳する、例えば次のよう  DCG考えてみます。ここでは

 
question(Query, Person) --> [who,is], question_(Query, Person). 

question_(parent_child(Parent,Child), Parent) --> [the,parent,of,Child]. 
question_(parent_child(Parent,Child), Child) --> [the,child,of,Parent]. 
question_(married(Person0,Person), Person) --> [married,to,Person0]. 
question_(spouse(Person0,Person), Person)  --> [the,spouse,of,Person0]. 

を、私はあなたを想定しています与えられた文をすでにのトークンに変換しました。これは、プロローグ  アトムとして表しています。これは、することができます

 
:- set_prolog_flag(double_quotes, chars). 

あなたが例えば書き込み:

 
?- Xs = "abc". 
Xs = [a, b, c]. 

したがって、そのようなで動作するように非常に便利になり

便利DCGsで動作させるために、私は強く、次の宣言をお勧めしますプログラム。私は の練習としての文字をからのトークンに変換しておきます。

あなたは、このようなトークンを持っていたら、プロローグリストなどのトークンのを関連付けるためにDCGを使用することができ、あなたの プログラム上を照会します。例えば

 
?- phrase(question(Query, Person), [who,is,the,parent,of,timmy]). 
Query = parent_child(Person, timmy) . 

もう一つの例:

 
?- phrase(question(Query, Person), [who,is,the,spouse,of,sarah]). 
Query = spouse(sarah, Person). 

は実際に実行このようなクエリは、単に目標として、それらを投稿します。たとえば、

これは、このような変換がPrologでは非常に簡単であることを示しています。

@GuyCoderは既にコメントに記載されているので、DCG  表記の詳細については、をご覧ください。

+1

ありがとう!それはたくさんの助けになります! – prolog

+0

速い質問!ユーザー入力を受けてLISTにアトミック化されている場合は、プログラム内のphrase(question(Query、Person)、LIST)にリストを渡し、Queryを呼び出すと、なぜ「true」と表示されますかコマンドラインからフレーズ(question(Query、Person)、[who、is、the、parent、of、timmy])を入れるときのような実際の結果は? – prolog

+1

あなたが構築しているクエリに 'Person'を関連付けるのを忘れたのでしょうか?プログラムをコンパイルするときに**シングルトンの警告**が出るかどうかを見てください。これは、変数名が常に疑わしい句で一度だけ使用されることを意味します。通常は、変数を他の変数に関連付けることを忘れてしまったり、名前を誤って入力したりしています。私が掲示した例では、 'question(Query、Person)'の 'Person'を使って、トップレベルの報告者がこの非常に可変の実際の解決策を報告させています。 DCG条項は、この変数を参照して、私たちが探している人物に関連させます。 – mat

関連する問題