【发布时间】:2017-04-16 11:13:46
【问题描述】:
这对我来说似乎很好,但它总是给出错误的......我不明白为什么。
letter(X) --> [C], {"a"=<C, C=<"z", name(X,[C])}.
谢谢。
【问题讨论】:
标签: prolog swi-prolog dcg
这对我来说似乎很好,但它总是给出错误的......我不明白为什么。
letter(X) --> [C], {"a"=<C, C=<"z", name(X,[C])}.
谢谢。
【问题讨论】:
标签: prolog swi-prolog dcg
最简单的方法是确保您的语法从一开始就包含字符。在这种情况下,您不需要使用name/2(或更确切地说是char_code/2)进行转换。
:- set_prolog_flag(double_quotes, chars).
letter(C) --> [C], { atom_length(C,1), a @=< C, C @=< z }.
这应该适用于任何系统。在SWI中,还有char_type/2:
letter(C) --> [C], { atom_length(C,1), char_type(C, lower) }.
这还将接受除 a..z 之外的其他小写字符,例如变音符号。
注意目标atom_length(C,1),它确保只有字符。否则,letter//1 也会在其他条件下成功。
【讨论】: