如何为有效数字指定 DCG? [英] How do I specify a DCG for a valid number?

查看:40
本文介绍了如何为有效数字指定 DCG?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为一个有效数字指定一个 DCG,如下所示:

value(Number) -->valid_number(数字).

基本上检查一个指定的值是否是数字,(它也可能是一个变量,所以有必要检查).

我不知道如何构建这个 valid_number DCG/谓词.

现在我只有:

valid_number('1') -->['1'].valid_number('2') -->['2']....

哪个有效,但显然很糟糕.尝试类似:

valid_number(Number) -->{ integer(Number), Number = Number }.

这两个都不起作用,而且看起来也很恶心(对不起,对 Prolog 很陌生,正在努力学习最佳实践).

我将如何构建这个 DCG/谓词来验证它是否是一个数字?

解决方案

我给你一个描述自然数字的代码示例:

<预>:- set_prolog_flag(double_quotes, chars).natural_number(N) --> number_(Cs), { number_codes(N, Cs) }.number_([D|Ds]) --> digit(D), number_(Ds).number_([D]) --> 数字(D).digit(D) --> [D], { char_type(D, digit) }.

示例用法:

?- 短语(natural_number(N), "123").N = 123 ;错误的.

我将此作为练习推广到其他数字.

I'm trying to specify a DCG for a valid number that would be used like so:

value(Number) --> valid_number(Number).

Basically checking if a specified value is numeric, (it could also be a variable, so it's necessary to check).

I don't know how to build this valid_number DCG/predicate though.

Right now I just have:

valid_number('1') --> ['1'].
valid_number('2') --> ['2'].
...

Which works but it obviously terrible. Trying something like:

valid_number(Number) --> { integer(Number), Number = Number }.

Which both doesn't work and admittedly looks pretty gross as well (I'm sorry, very new to Prolog and trying to learn best practices).

How would I go about building this DCG/predicate that validates whether or not it's a number?

解决方案

I give you a code sample that describes natural numbers:

:- set_prolog_flag(double_quotes, chars).

natural_number(N) --> number_(Cs), { number_codes(N, Cs) }.

number_([D|Ds]) --> digit(D), number_(Ds).
number_([D])    --> digit(D).

digit(D) --> [D], { char_type(D, digit) }.

Example usage:

?- phrase(natural_number(N), "123").
N = 123 ;
false.

I leave generalizing this to other numbers as an exercise.

这篇关于如何为有效数字指定 DCG?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆