这对我来说似乎很好,但它总是假的......我无法理解为什么。
letter(X) --> [C], {"a"=<C, C=<"z", name(X,[C])}.
谢谢。
答案 0 :(得分:4)
最简单的方法是确保你的语法从一开始就变得很容易。在这种情况下,您无需使用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
也会成功获得其他条款。