如何检查字符串是否只包含Prolog中的某些字符?

时间:2016-02-05 08:45:51

标签: prolog swi-prolog

我想写一个谓词containsOnly(X,Y),如果字符串X只包含字符串Y中的字符,则返回true。

我是这样写的:

containsOnly([],_).
containsOnly([H|T],AcceptableCharacters) :- 
    member(H, AcceptableCharacters),
    containsOnly(T,AcceptableCharacters).

但下面的查询返回false。如何修改谓词以使它们返回true?

containsOnly('A', 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜabcdefghijklmnopqrstuvwxyzäöüАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзиклмнопрстуфхцчшщъыьэюя-').
containsOnly('a', 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜabcdefghijklmnopqrstuvwxyzäöüАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзиклмнопрстуфхцчшщъыьэюя-').

2 个答案:

答案 0 :(得分:1)

使用原子,如您的问题,符合ISO标准的解决方案:

containsOnly(X,Y) :- forall(sub_atom(X,_,1,_,C), sub_atom(Y,_,1,_,C)).

而SWI-Prolog版本。 > = 7似乎接受了'字符串'还

答案 1 :(得分:0)

您的问题是数据类型。您使用原子,但将它们视为字符/代码列表。您可以尝试使用双引号"而不是单引号',看看是否有帮助。

使用SWI-Prolog 7或更高版本,它无法提供帮助。你必须使用反引号而不是双引号。

你真的应该弄清楚文档和数据类型。

这是SWI-Prolog 7中的代码列表:

`абвгд`

0'x是字符代码的Prolog表示法:

?- X = 0'г.
X = 1075.

?- X = `абв`.
X = [1072, 1073, 1074].

另一件事:如果您使用SWI-Prolog,则在这种特殊情况下应使用memberchk/2而不是member/2。但是,如果这是一个效率瓶颈,您也可以考虑使用this page底部描述的方法。 (如果您要处理SWI-Prolog程序中的文本,本手册的整个部分非常重要。)