2012-05-03 36 views
3

我有一個方法長度(列表,var),它給了我一個列表的長度,但我想找到一個字符串的長度,任何人都有一個解決方案?如何使用序言找到字符串長度

+0

檢查[「在Prolog中使用字符串」](http://obvcode.blogspot.com/2008/11/working-with-strings-in-prolog.html)文章 –

+1

本文引起混淆(混合字符串和原子)並建議非標準謂詞。我建議不要閱讀它。我會avise [這個優秀的答案](http://stackoverflow.com/questions/8264699/what-is-the-difference-between-and-in-prolog/8269897#8269897)得到什麼是Prolog字符串。 – m09

回答

1

只是用它玩,我給了謂語

?- length("hello", R). 
R = 5. 

令人驚訝它的工作:)

+3

中是更好的選擇您可以檢查您的prolog系統並查詢prolog標誌double_quotes。如果它表示代碼,則雙引號將作爲字符代碼列表讀入。SWI-Prolog:? - current_prolog_flag(double_quotes,X)。 X =代碼。 - 「你好」= [104,101,108,108,111]。 爲真。 –

3

由於字符串是原子,你不能直接操縱他們得到的長度,提取子等,首先你必須將它們轉換爲字符名單與atom_chars/2

atom_chars(StrVar, ListVar), length(ListVar, LengthVar). 
+1

'name/2'不是ISO Prolog,在這裏不是最好的選擇。 – m09

+0

謝謝,@Mog。更新。但正如CM所說,atom_length在ISO –

6

如果你想去ISO Prolog,那麼你就不會使用 的name/2謂詞。

ISO Prolog爲您提供atom_codes/2atom_chars/2。它們爲您提供將原子轉換回代碼列表 或字符列表的功能。原子是一個Prolog的系統的字符串, 人物僅僅是長度爲1的原子下面是一些例子invokations兩個謂詞 :

?- atom_codes(ant, L). 
L = [97,110,116] 
?- atom_codes(X, [97,110,116]). 
X = ant 
?- atom_chars(ant, X). 
X = [a,n,t] 
?- atom_chars(X,[a,n,t]). 
X = ant 

現在你想知道如何判斷一個字符串又名原子的長度。一個 的方法是首先確定代碼或字符,然後 計算該列表的長度。但ISO也提供了一個謂詞。其工作原理如下:

?- atom_length(ant,X). 
X = 3 

大部分Prolog系統提供這套內置謂詞,即 SWI序言,序言GNU,Jekejeke的Prolog等..可用字符 代碼範圍和編碼依賴Prolog的系統上。一些允許 只有8位代碼,一些16位代碼和一些32位代碼。

另外,原子的最大長度可能不同,有時候 是一個額外的字符串類型,它與原始類型 類型不同。但是這種額外類型通常與雙引號封閉字符串 不同,它只是 字符列表的簡寫。

再見

0

也許這:從Prolog的手動

string_length(+String, -Length) 

+0

這可用於SWI-Prolog,但我不知道這個謂詞是否內置於其他Prolog系統。 –