使用 dcgs 终止 prolog 查询

问题描述 投票:0回答:1

鉴于程序

foo([]) --> [].
foo([Start|Rest]) --> alphanum(Start), foo(Rest).

alphanum(Ch)  --> [Ch], { char_type(Ch, alnum) }.

如何使查询

length(I, 2), phrase(foo(C), I), false.
终止? 我在用
SWI-Prolog version 8.4.3 for x86_64-linux

不终止似乎源于上次dcg规则。使用以下程序(不是我想要的),查询终止。

foo([]) --> [].
foo([Start|Rest]) --> alphanum(Start), foo(Rest).

alphanum(Ch)  --> [Ch].

我不介意实现相同结果的任何其他程序形式

prolog dcg non-termination
1个回答
1
投票

will 终止 - 但是有很多 Unicode 字符组合可以循环。

您可能想要代替(请注意,这是使用通常首选的 codes 而不是字符):

foo([]) --> [].
foo([Start|Rest]) --> alnum(Start), foo(Rest).

alnum(Digit) --> [Digit], { between(0'0, 0'9, Digit) }.
alnum(Lower) --> [Lower], { between(0'a, 0'z, Lower) }.
alnum(Upper) --> [Upper], { between(0'A, 0'Z, Upper) }.

swi-prolog 中的结果:

?- length(I, 2), phrase(foo(C), I), writeln(I), false.
...
[90,88]
[90,89]
[90,90]
false.
© www.soinside.com 2019 - 2024. All rights reserved.