我是Prolog的新手,注意到'和'給出了不同的行爲,但是爲什麼好奇。具體來說,加載文件時,?- ['test1.pl'].
工作,而?- ["test1.pl"].
不。Prolog中的'和「有什麼區別?
回答
單引號的項目總是原子。
雙引號的含義取決於Prolog的標誌double_quotes
:
— 這個值"a" = a
。如今,這很少使用。但是你會發現編寫["abc.pl"]
的Prolog書籍。
codes
— 的字符代碼列表。這通常是默認的,但它會導致非常不可讀的答案就像
?- set_prolog_flag(double_quotes,codes). true. ?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). Satz = [74,97,32,116,118,111,105,32,115,108,117,103,97,33] ; Satz = [74,97,32,116,118,111,105,32,114,97,98,111,116,110,105,107,33].
更糟的是,如果你使用的字符超出ASCII:
?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). Satz = [1071,32,1090,1074,1086,1081,32,1089,1083,1091,1075,1072,33] ; Satz = [1071,32,1090,1074,1086,1081,32,1088,1072,1073,1086,1090,1085,1080,1082,33].
chars
—一個列表-char原子。 See this瞭解更多信息。
?- set_prolog_flag(double_quotes,chars). true. ?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). Satz = ['J',a,' ',t,v,o,i,' ',s,l,u,g,a,!] ; Satz = ['J',a,' ',t,v,o,i,' ',r,a,b,o,t,n,i,k,!]. ?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). Satz = ['Я',' ',т,в,о,й,' ',с,л,у,г,а,!] ; Satz = ['Я',' ',т,в,о,й,' ',р,а,б,о,т,н,и,к,!].
這個表示法給出了更多可讀的答案。它可以更加緊湊地顯示,因爲雙引號符號可以用於打印任何單字符原子的列表。 SICStus和SWI有library(double_quotes)
。
?- use_module(library(double_quotes)). true. ?- phrase(("Ja tvoi ",("sluga"|"rabotnik"),"!"), Satz). Satz = "Ja tvoi sluga!" ; Satz = "Ja tvoi rabotnik!". ?- phrase(("Я твой ",("слуга"|"работник"),"!"), Satz). Satz = "Я твой слуга!" ; Satz = "Я твой работник!".
如果您在安裝double_quotes.pl
作爲庫困難,簡單地把它放到你的其他的Prolog文件的目錄,並說:use_module(double_quotes).
感謝您對上述答案進行擴展。 – astay13
@ astay13這個答案是正確的,而另一個不是。它不會「擴大」其他答案。 – 2015-07-15 12:07:08
Prolog中的字符串用單引號引起來。術語用雙引號立即轉換爲字符代碼列表。
?- write('sdf').
sdf
true.
?- write("sdf").
[115, 100, 102]
true.
[相關問題](http://stackoverflow.com/questions/4391435/how-to-manipulate-strings-in-prolog) – CamilleLDN
* Prolog中的Atoms *用單引號引起來。 – Thilo
也許是次要的資格:原子通常只是寫下來。只有當他們會被誤認爲別的東西(比如變量)時,你纔會用單引號括起來。你可以選擇在任何情況下做到這一點,只是沒有意義。 – mat
- 1. 在Prolog中==和= =有什麼區別?
- 2. SWI prolog中#=和= = =有什麼區別
- 3. 有什麼區別`和$(Bash中有什麼區別?
- 4. 有什麼區別? :和||
- 5. &&和||有什麼區別?
- 6. 「/」和「/ *」有什麼區別?
- 7. 有什麼區別:。!和:r!?
- 8. ==和===有什麼區別?
- 9. Appender和〜有什麼區別?
- 10. $ @和$ *有什麼區別?
- 11. is和=有什麼區別?
- 12. #.00和#。##有什麼區別?
- 13. `==`和`is`有什麼區別?
- 14. '=='和'==='有什麼區別?
- 15. /和/#/有什麼區別?
- 16. | 0和~~有什麼區別?
- 17. `&`和`ref`有什麼區別?
- 18. ==和===有什麼區別?
- 19. ==和===有什麼區別?
- 20. `{}`和`[]`有什麼區別?
- 21. JavaScript和=== ===有什麼區別?
- 22. difftime和' - '有什麼區別?
- 23. =和==有什麼區別?
- 24. console.log中的和+有什麼區別?
- 25. Perl中的'eq'和'=〜'有什麼區別?
- 26. HTML5中的&和&有什麼區別?
- 27. MATLAB中的{}和[]有什麼區別?
- 28. Ada中的=和=>有什麼區別?
- 29. bash中的'和'有什麼區別?
- 30. Swift中的「:」和「=」有什麼區別?
在SWI-Prolog的7,後來,工作和含義相同。正如有人肯定指出的那樣,這不符合ISO-Prolog標準的行爲。請不要接受當前接受的答案,因爲它不正確。 – 2015-09-08 13:10:45
@Boris:帶'set_prolog_flag(double_quotes,atom)'這兩個查詢都與IF/Prolog中默認示例相同。即使SWI7 [可以做得更好](http://www.complang.tuwien.ac.at/ulrich/iso-prolog/SWI7_and_ISO#strings_less_non_conforming),儘管整體上SWI7並不符合。 – false