首页 > 解决方案 > DCG prolog 返回多个变量答案

问题描述

考虑以下代码片段:任务是从形式的句子中获取变量及其值[the, variable, x, is, five,fullstop]。这样一个句子中的变量和值将是X=5or [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(库(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 从 say 更新[[X,5]]为 CurrentVariables [[X,5], [Y,10]]

标签: prologdcg

解决方案


推荐阅读