DCG序言返回多个变量答案

时间:2018-08-03 13:27:11

标签: prolog dcg

请考虑以下代码段: 任务是从[the, variable, x, is, five,fullstop]形式的句子中获取变量及其值。这样的句子中的变量和值将为X=5[X,5]

:-use_module(library(clpfd)).

test([the, variable, x, is, five,fullstop, the,variable, y, is, five, fullstop
    ]).

lpsolve(Data, Answers):- lpsolve( [], Variables, Answers, Data, [] ).
                        % labeling( [], Variables ).

lpsolve( PreviousVariables, CurrentVariables, Answers, Data, Remainder ) :- sentence(Answers, Data,Remainder).
lpsolve( PreviousVariables, CurrentVariables, Answers, Data, Remainder ) :- sentence(Answers, Data,SentencesInBetween),
                                    lpsolve( PreviousVariables, CurrentVariables,Answers,SentencesInBetween, Remainder).

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

如果我跑步:

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

但是想象一下X和Y不同的情况:

:-use_module(library(clpfd))。

test([the, variable, x, is, five,fullstop, the,variable, y, is, ten, fullstop
    ]).

lpsolve(Data, Answers):- lpsolve( [], Variables, Answers, Data, [] ).
                        % labeling( [], Variables ).

lpsolve( PreviousVariables, CurrentVariables, Answers, Data, Remainder ) :- sentence(Answers, Data,Remainder).
lpsolve( PreviousVariables, CurrentVariables, Answers, Data, Remainder ) :- sentence(Answers, Data,SentencesInBetween),
                                    lpsolve( PreviousVariables, CurrentVariables,Answers,SentencesInBetween, Remainder).

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).
Data = [the, variable, x, is, five, fullstop, the, variable, y|...],
false.

当然,它会尝试评估5=10?并失败。因此,问题在于如何将单独的变量及其值收集到Answer中。

答案类似于:

?- test(Data),lpsolve(Data, Answer).
    Data = [the, variable, x, is, five, fullstop, the, variable, y|...],
    X= 5, Y=10.

此外,如何将变量X和Y收集到PreviousVariables和CurrentVariables中?当我在输入数据中遇到一个新句子时(一个新句子在句号停止后开始。请参见输入数据格式),我应该将PreviousVariables从说[[X,5]]更新为CurrentVariables [[X,5], [Y,10]]

0 个答案:

没有答案