2016-11-26 4 views
1

DCGで次のような過渡関数を作ることはできますか?または、DCGルールと組み合わせることはできますか?DCGの過渡関数

genx(A,B) :- gen(A,B). 
genx(A,C) :- gen(A,B), genx(B,C). 
gen(a,b). 
gen(b,c). 

私は、私は正確にやろうとしているかを説明します:

私はこの文法を持っている場合:

noun_phrase(D,N) --> det(D), noun(N). 
noun(n(cat)) --> [cat]. 

私はNnoun(N)にしたい場合のように、いくつかの制限を作りたいです動物である。 undestandのおかげ

答えて

0

わからない

gen(cat,pet). 
gen(pet,animal). 

:猫の情報は、動物がのようないくつかの事実からinferencedされ

noun_phrase(np(D,N)) --> det(D), noun(N), genx(N, animal). 

:だから私はこのようなものを使用することができます。ビューの正式な観点からルール

genx(A,B) :- gen(A,B). 
genx(A,C) :- gen(A,B), genx(B,C). 

genx --> gen. 
genx --> gen, genx. 

と、事実と、

gen(a, b). 
gen(b, c). 
としてDCG構文で記述することができ

私は間違っていないよ場合は、

genx(a, c)はtrueを返す必要があります。

しかし、DCGのA,B,Cはリストになるように意図されています。

このように代数ルールを実装するためにDCG(解析用)を使用するのが妥当であるかどうかはわかりません。

+0

回答ありがとうございますが、動作しないようです!あなたはもっと明確な答えを出すことができますか? – user2598997

+0

@ user2598997 - プロローグを使用していますか?私はgpr​​ologとswi-prologで作業しているのを見ています。 not listが問題であれば、 'gen([a]、[b])'と 'gen([b]、[c])の中の事実を変更することができます。 'genx([a]、[c])'は真を返します。 – max66

+0

私はswi-prolog(オンラインvserion)を使用しています。 genx(A、B)→gen(A、B)。 genx(A、C)→gen(A、B)、genx(B、C)。 gen([a]、[b])。 gen([b]、[c])。プロシージャ 'genx(A、B) 'が存在しません。 – user2598997