首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PROLOG - DCG解析

PROLOG - DCG解析
EN

Stack Overflow用户
提问于 2013-10-19 04:32:31
回答 1查看 765关注 0票数 3

你好,我是新的Prolog和DGC.I,我想写一个DCG来解析时间表达式,比如上午10时20分或凌晨12点。我如何检查上午10时20分是有效的表达式,或不是为奥尔科克,我写了一些代码。

代码语言:javascript
复制
oclock --> digit1,phrase1.

digit1 --> [T],{digit1(T)}.
digit1(1).
digit1(2).
digit1(3).
digit1(4).
digit1(5).
digit1(6).
digit1(7).
digit1(8).
digit1(9).
digit1(10).
digit1(11).
digit1(12).

phrase1 --> [P],{phrase1(P)}.
phrase1(Oclock).

我要通过查询检查

代码语言:javascript
复制
oclock([1,oclock],[]).

有人能帮我吗。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-19 09:47:24

--关于您现有代码的简要说明:

在您的定义phrase1(Oclock)中,Oclock是完全不确定的,这意味着任何东西都将算作phrase1。因此,对于任何单个元素列表,phrase1\\0的DCG规则都是正确的:

代码语言:javascript
复制
?- phrase(phrase1, X).
X = [_G481].

?- phrase(phrase1, [a]).
true.

?- phrase(phrase1, [abababab]).
true.

?- phrase(phrase1, [[aba,dbdi,dbdi]]).
true.

?- phrase(phrase1, []).
false.

--问题的可能解决方案

以下是一个可能的解决方案:

代码语言:javascript
复制
time --> hours, suffix. 

suffix  --> sep, minutes, meridiem.
suffix  --> ['oclock'].

hours   --> {between(1,12,H)}, [H].
sep     --> ['.'].
minutes --> {between(1,60,M)}, [M].

meridiem --> [am].
meridiem --> [pm].

使用查询测试它:

代码语言:javascript
复制
?- phrase(time, [1,'.',10,am]).
true.

phrase/2phrase/3是调用DCG规则的标准谓词。您还可以查询phrase(time, X),并看到用所有可能的时间实例化X。

为了防止出现任何混淆,这个解决方案和您自己的解决方案都只适用于原子字符串,而不是字符串字符。因此,如果您试图通过在文件中读取来解析自然语言,您将不得不做一些工作,要么将输入的字符转换为原子,要么让dcg处理字符。例如,

代码语言:javascript
复制
time --> hours, suffix. 

suffix  --> sep, minutes, meridiem.
suffix  --> " oclock".

hours   --> {hours(H)},  H.
sep     --> ".".
minutes --> {minutes(M)}, M.

meridiem --> " am".
meridiem --> " pm".

hours(H)    :-
    between(1,12,N),
    atom_codes(N,H).
minutes(M)  :-
    between(1,60,N),
    atom_codes(N,M).

原子列表已被交换为字符代码列表;由于SWI中的file:///opt/local/lib/swipl-6.4.1/doc/Manual/manipatom.html#atom_chars/2,原子和代码字符之间的转换可以通过下面列出的谓词来实现:?- A = "aaa". A = [97, 97, 97].

手册中还有更多与字符相关的谓词。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19462390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档