请考虑以下代码段:
任务是从[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]]
。