我想写一个谓词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äöüАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзиклмнопрстуфхцчшщъыьэюя-').
答案 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程序中的文本,本手册的整个部分非常重要。)