2016-02-05 12 views
1

Я хочу, чтобы написать предикат containsOnly(X,Y), который возвращает истину, если строка X содержит только символы из строки Y.Как проверить, что строка содержит только определенные символы в Prolog?

Я написал об этом так:

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

Но запросы ниже возвращения ложными. Как изменить предикат, чтобы они вернули true?

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

Пожалуйста, сначала прочитайте [связанный вопрос] (http://stackoverflow.com/q/8264699/1613573) о различии между '' 'и' '' в Prolog и важном флаге 'double_quotes'. – mat

ответ

1

работы с атомами, как в вашем вопросе, решение ИСО соответствует:

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

в то время как SWI-Prolog ver. > = 7, похоже, принимает его и для «строк».

0

Ваша проблема связана с типом данных. Вы используете атомы, но вы рассматриваете их как списки символов/кодов. Вы можете попробовать использовать двойные кавычки " вместо одинарных кавычек ' и посмотреть, поможет ли это.

С помощью SWI-Prolog 7 или новее это не поможет. Вам придется использовать backticks вместо двойных кавычек.

Вы действительно должны выяснить документацию и типы данных.

Это список кодов в SWI-Prolog 7:

`абвгд` 

И 0'x является Prolog обозначение кодов символов:

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

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

Другое дело: если вы используете SWI-Пролог, вы должны использовать memberchk/2 вместо member/2 в данном конкретном случае. Однако, если это узкое место в эффективности, вы также можете использовать метод, описанный в самом конце this page. (. Весь этот раздел руководства очень важно, если вы собираетесь иметь дело с текстом в программе SWI-Prolog)

+2

Ваш Ответ специфичен только для SWI 7. Для решения, которое работает во всех системах, включая SWI7, см. [этот ответ] (http://stackoverflow.com/a/8269897/772868). – false

+0

@false Да, действительно. Вопрос был помечен [swi-prolog], поэтому я позволил себе эту легкомыслие. –

Смежные вопросы