gpt4 book ai didi

PROLOG - DCG 解析

转载 作者:行者123 更新时间:2023-12-01 15:29:05 26 4
gpt4 key购买 nike

你好,我是 Prolog 和 DGC 的新手。我想编写一个 DCG 来解析时间表达式,例如 10.20 am 或 12 oclock。我如何检查 10.20 am 对于 Olcock 是否是有效表达式我写了一些代码。

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],[]).

谁能帮我解决这个问题。

最佳答案

关于您现有代码的快速说明:

在您的定义 phrase1(Oclock) 中,Oclock 完全未确定,这意味着 anything 将算作 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/2phrase/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).

原子列表已换成字符代码列表;因为 ?- A = "aaa"。 A = [97, 97, 97]. 在 SWI-Prolog 中,原子和代码字符之间的转换可以通过此处列出的谓词实现:file:///opt/local/lib/swipl-6.4.1/文档/手册/manipatom.html#atom_chars/2

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

关于PROLOG - DCG 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19462390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com