DCG中的传递函数

时间:2016-11-26 22:06:32

标签: prolog 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].

我想制定一些限制,比如我希望N中的noun(N)成为动物。所以我可以使用这样的东西:

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

如果猫的信息是动物,可以从以下事实中推断:

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

由于

1 个答案:

答案 0 :(得分:0)

不确定不准。

如果我没有错,从正式的角度来看规则

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

可以用DCG语法编写为

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

并且,事实上,

gen(a, b).
gen(b, c).

genx(a, c)应该返回true。

但是,DCG中的ABC是列表。

我不知道以这种方式使用DCG(用于解析)来实现代数规则是否合理。