在 Prolog 中解析多位数字

发布于 2024-09-10 14:17:45 字数 439 浏览 5 评论 0原文

我有以下简单的表达式解析器:

expr(+(T,E))-->term(T),"+",expr(E).
expr(T)-->term(T).

term(*(F,T))-->factor(F),"*",term(T).
term(F)-->factor(F).

factor(N)-->nat(N).
factor(E)-->"(",expr(E),")".

nat(0)-->"0".
nat(1)-->"1".
nat(2)-->"2".
nat(3)-->"3".
nat(4)-->"4".
nat(5)-->"5".
nat(6)-->"6".
nat(7)-->"7".
nat(8)-->"8".
nat(9)-->"9".

但是,这只支持 1 位数字。在这种情况下如何解析多位数字?

I have the following simple expression parser:

expr(+(T,E))-->term(T),"+",expr(E).
expr(T)-->term(T).

term(*(F,T))-->factor(F),"*",term(T).
term(F)-->factor(F).

factor(N)-->nat(N).
factor(E)-->"(",expr(E),")".

nat(0)-->"0".
nat(1)-->"1".
nat(2)-->"2".
nat(3)-->"3".
nat(4)-->"4".
nat(5)-->"5".
nat(6)-->"6".
nat(7)-->"7".
nat(8)-->"8".
nat(9)-->"9".

However this only supports 1-digit numbers. How can I parse numbers with multiple digits in this case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

与风相奔跑 2024-09-17 14:17:45

使用累加器变量,并在递归调用中传递这些变量。下面,A和A1是累加器。

digit(0) --> "0".
digit(1) --> "1".
% ...
digit(9) --> "9".

nat(N)   --> digit(D), nat(D,N).
nat(N,N) --> [].
nat(A,N) --> digit(D), { A1 is A*10 + D }, nat(A1,N).

请注意,第一个 nat 子句通过使用数字来初始化累加器,因为您不想匹配空字符串。

Use accumulator variables, and pass those in recursive calls. In the following, A and A1 are the accumulator.

digit(0) --> "0".
digit(1) --> "1".
% ...
digit(9) --> "9".

nat(N)   --> digit(D), nat(D,N).
nat(N,N) --> [].
nat(A,N) --> digit(D), { A1 is A*10 + D }, nat(A1,N).

Note that the first nat clause initializes the accumulator by consuming a digit, because you don't want to match the empty string.

往日情怀 2024-09-17 14:17:45
nat(0). 
nat(N):-nat(N-1).

但你使用了我不知道的语法(请参阅上面我的评论)。

nat(0). 
nat(N):-nat(N-1).

But you use a syntax that I don't know (see my comment above).

风情万种。 2024-09-17 14:17:45

您能提供示例输入吗?

我认为这可能有效:

nat(N)-->number(N).

如果失败,请尝试:

nat(N)-->number(N),!.

!是一个削减,它阻止了统一。您可以在书籍/教程中阅读有关它的内容。

Can you provide a sample input?

I think this might work:

nat(N)-->number(N).

If that fails try:

nat(N)-->number(N),!.

The ! is a cut it stops the unification. You can read about it in books/tutorials.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文