DCG prolog测试几个句子

DCG prolog测试几个句子,prolog,dcg,Prolog,Dcg,如果我有下面的代码,我将如何使其生成Answer=5和Answer2=10?。我运行目标?-testData,lpsolveData,[Answer1,Answer2] 实际运行且密切相关的程序示例如下: :-use_module(library(clpfd)). test([the, variable, X, is, five,fullstop]). lpsolve(Data, Answer):- sentence(Answer, Data,[]). sentence(X) --> n

如果我有下面的代码,我将如何使其生成Answer=5和Answer2=10?。我运行目标?-testData,lpsolveData,[Answer1,Answer2]

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

:-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).
false.
我只有一句话要测试,目标成功,如下所示

 ?- 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}.
我得到以下信息:

:-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).
false.

我真的不知道你想在这里做什么,但我觉得你的DCG以一种完全奇怪的方式崩溃了,你可能会从另一种安排方式中受益

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

sentences([S|Ss]) --> sentence(S), sentences(Ss).
sentences([]) --> [].
什么是句子?在你的简单系统中,它是一个名词短语和一个动词短语。但是你把英语中的名词和动词短语错误地分开了,像变量X是5这样的句子应该被分成名词短语主语变量X和动词短语是5。理想情况下,动词短语应该进一步分解为动词或名词短语,但我们现在忽略了这个细节。我要寻找的动词是将其与Prolog谓词=/2关联,并在此处处理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.

我真的不知道你想在这里做什么,但我觉得你的DCG以一种完全奇怪的方式崩溃了,你可能会从另一种安排方式中受益

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

sentences([S|Ss]) --> sentence(S), sentences(Ss).
sentences([]) --> [].
什么是句子?在你的简单系统中,它是一个名词短语和一个动词短语。但是你把英语中的名词和动词短语错误地分开了,像变量X是5这样的句子应该被分成名词短语主语变量X和动词短语是5。理想情况下,动词短语应该进一步分解为动词或名词短语,但我们现在忽略了这个细节。我要寻找的动词是将其与Prolog谓词=/2关联,并在此处处理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.

这是错误的做法。只保留一个答案变量,就像原始答案一样。Prolog将找到每个答案的解决方案。如果您确实需要一个列表,请使用findall/3。此外,还可以去掉多余的名词短语->[the],[variable]。句子->名词短语,逐字短语。。这些规则已经存在,没有必要再制定。换句话说,您的代码和原始代码之间的唯一区别应该是额外的verbphraseX->。。。子句来处理不同的数字。请参阅我的编辑。我不知道你是不是这个意思。它的结果是错误的事实上,它只会导致5,而不是错误。我遗漏了一件事:您还需要测试[the,variable,y,is,ten,fullstop]。除了测试[the,variable,x,is,five,fullstop]之外,还有没有一种方法可以提供所有句子,然后说句号?我这样问是因为我想输入相关的句子来解决一些限制。一次只喊一个目标可能不管用。我有点恼火,你把限定词和形容词解析为名词短语,把一个简单的名词和一个动词作动词短语/这是错误的做法。只保留一个答案变量,就像原始答案一样。Prolog将找到每个答案的解决方案。如果您确实需要一个列表,请使用findall/3。此外,还可以去掉多余的名词短语->[the],[variable]。句子->名词短语,逐字短语。。这些规则已经存在,没有必要再制定。换句话说,您的代码和原始代码之间的唯一区别应该是额外的verbphraseX->。。。子句来处理不同的数字。请参阅我的编辑。我不知道你是不是这个意思。它的结果是错误的事实上,它只会导致5,而不是错误。我遗漏了一件事:您还需要测试[the,variable,y,is,ten,fullstop]。除了测试[the,variable,x,is,five,fullstop]之外,还有没有一种方法可以提供所有句子,然后说句号?我这样问是因为我想输入相关的句子来解决一些限制。一次只喊一个目标可能不管用。我有点恼火,你把限定词和形容词解析为名词短语,把一个简单的名词和一个动词作动词短语/