2016-02-05 157 views
1

我想寫一個謂語containsOnly(X,Y),返回true,如果字符串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

與原子的工作,因爲在你的問題中,符合ISO標準的解決方案:

containsOnly(X,Y) :- forall(sub_atom(X,_,1,_,C), sub_atom(Y,_,1,_,C)). 
SWI-Prolog ver。

> = 7似乎也接受它的'字符串'。

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程序文本)

+2

Your答案只適用於SWI7,對於包括SWI7在內的所有系統都能正常工作的解決方案,請參閱[本答案](http://stackoverflow.com/a/8269897/772868)。 – false

+0

@false是的,確實如此。 [swi-prolog],所以我讓自己這種輕浮。 – 2016-02-06 22:38:13

相關問題