你好,我是新的Prolog和DGC.I,我想写一个DCG来解析时间表达式,比如上午10时20分或凌晨12点。我如何检查上午10时20分是有效的表达式,或不是为奥尔科克,我写了一些代码。
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).我要通过查询检查
oclock([1,oclock],[]).有人能帮我吗。
发布于 2013-10-19 09:47:24
--关于您现有代码的简要说明:
在您的定义phrase1(Oclock)中,Oclock是完全不确定的,这意味着任何东西都将算作phrase1。因此,对于任何单个元素列表,phrase1\\0的DCG规则都是正确的:
?- phrase(phrase1, X).
X = [_G481].
?- phrase(phrase1, [a]).
true.
?- phrase(phrase1, [abababab]).
true.
?- phrase(phrase1, [[aba,dbdi,dbdi]]).
true.
?- phrase(phrase1, []).
false.--问题的可能解决方案
以下是一个可能的解决方案:
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].使用查询测试它:
?- phrase(time, [1,'.',10,am]).
true.phrase/2或phrase/3是调用DCG规则的标准谓词。您还可以查询phrase(time, X),并看到用所有可能的时间实例化X。
为了防止出现任何混淆,这个解决方案和您自己的解决方案都只适用于原子字符串,而不是字符串字符。因此,如果您试图通过在文件中读取来解析自然语言,您将不得不做一些工作,要么将输入的字符转换为原子,要么让dcg处理字符。例如,
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].。
手册中还有更多与字符相关的谓词。
https://stackoverflow.com/questions/19462390
复制相似问题