prolog - DCG prolog 返回多个变量答案
问题描述
考虑以下代码片段:任务是从形式的句子中获取变量及其值[the, variable, x, is, five,fullstop]
。这样一个句子中的变量和值将是X=5
or [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]]
。
解决方案
推荐阅读
- python - Matplotlib 条件标记颜色
- cypher - CYPHER 获取节点之间的边
- angular - 带有 @Input 装饰器的 Angular 6 Karma 测试子类
- java - 使用带有依赖关系的单行命令行调用运行简单的一个文件 java 程序
- java - 放心 - 使用 GPath 从多个记录列表中提取单个值
- dart - Flutter:如何使用双列表对表的数据进行排序
- c# - c#对象参数在分配参数后神秘地清除
- python - 循环遍历数据框以根据 python 中的 2 个索引返回行
- php - Laravel 5.3 应用程序抛出错误而不是显示登录视图
- abap - 通过 ME_PROCESS_PO_CUST BAdi 更新 ME21n 字段 WEORA/BSTAE?