DCG Prolog测试几句话

时间:2018-08-02 20:00:50

标签: prolog dcg

如果我有以下代码,我将如何使其产生Answer= 5 and Answer2= 10?。我实现了目标?- test(Data),lpsolve(Data, [Answer1,Answer2]).

    :-use_module(library(clpfd)).
    test([the, variable, X, is, five,fullstop,
          the,variable, Y, is, ten, fullstop]).
    lpsolve(Data, [Answer,Answer2]):- sentence(Answer, Data,[]).

    sentence(X) --> nounphrase, verbphrase(X).
    nounphrase --> [the], [variable].
    verbphrase(X) --> [X], [is], [five],[fullstop], {X = 5}.

    sentence(Y) --> nounphrase, verbphrase(Y).
    nounphrase --> [the], [variable].
    verbphrase(Y) --> [Y], [is], [ten],[fullstop], {Y = 10}.

以下是实际运行且密切相关的程序的示例:

:-use_module(library(clpfd)).
test([the, variable, X, is, five,fullstop]).
lpsolve(Data, Answer):- sentence(Answer, Data,[]).

sentence(X) --> nounphrase, verbphrase(X).
nounphrase --> [the], [variable].
verbphrase(X) --> [X], [is], [five],[fullstop], {X = 5}.

我只有一句话要测试,目标成功,如下所示。

 ?- test(Data),lpsolve(Data, Answer).
    Data = [the, variable, 5, is, five],
    Answer = 5.

编辑

我尝试按照第一条评论进行以下操作:

:-use_module(library(clpfd)).

test([the, variable, x, is, five,fullstop,
      the,variable, y, is, ten, fullstop]).
lpsolve(Data, Answer):- sentence(Answer, Data,[]).

sentence(X) --> nounphrase, verbphrase(X).
nounphrase --> [the], [variable].
verbphrase(X) --> [x], [is], [five],[fullstop], {X = 5}. 
verbphrase(Y) --> [y], [is], [ten],[fullstop], {Y = 10}.

我得到以下信息:

-? test(Data),lpsolve(Data, Answer).
false.

1 个答案:

答案 0 :(得分:3)

我不太确定您要在这里做什么,但是我觉得您的DCG是以完全奇怪的方式分解的,您可能会从另一种安排方式中受益。

您有一个变量绑定列表,因此您应该已经在考虑获取结果列表而不是单个结果了:

sentences([S|Ss]) --> sentence(S), sentences(Ss).
sentences([]) --> [].

什么是句子?在您的简单系统中,它是一个名词短语和一个动词短语。但是对于英语,您已经错误地将名词和动词短语分开了,在该句子中,应将“变量X为5”之类的句子分解为名词短语主题“变量X”和动词短语“为5”。理想情况下,应将动词短语进一步分解为另一个名词短语的动词,但我们现在暂时忽略该细节。我正在寻找动词“是”以将其与Prolog谓词=/2相关联,并在此处处理fullstop

sentence(N1=N2) --> nounphrase(N1), verbphrase(is, N2), [fullstop].

好的,所以现在我们需要您的名词短语:

nounphrase(N) --> [the, variable, N].

您的动词短语:

verbphrase(is, V) --> [is], value(V).

我只处理这两种解码,并且在DCG定义中隐式地进行了处理:

value(5) --> [five].
value(10) --> [ten].

您会发现此方法适用于上面定义的用例:

?- phrase(sentences(S), [the,variable,X,is,five,fullstop,the,variable,Y,is,ten,fullstop]).
  S = [X=5, Y=10] ;
  false.