我是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. SWI prolog中#=和= = =有什么区别
- 2. 在Prolog中==和= =有什么区别?
- 3. 有什么区别`和$(Bash中有什么区别?
- 4. ==和===有什么区别?
- 5. ==和===有什么区别?
- 6. 有什么区别? :和||
- 7. ==和===有什么区别?
- 8. '=='和'==='有什么区别?
- 9. `&`和`ref`有什么区别?
- 10. 有什么区别:。!和:r!?
- 11. | 0和~~有什么区别?
- 12. Appender和〜有什么区别?
- 13. python中的{}和[]有什么区别?
- 14. 列表中的:::和++有什么区别?
- 15. SQL中的“LIKE”和“=”有什么区别?
- 16. console.log中的和+有什么区别?
- 17. Perl中的'eq'和'=〜'有什么区别?
- 18. MATLAB中的{}和[]有什么区别?
- 19. PHP中的 - >和::有什么区别?
- 20. xtype和别名有什么区别?
- 21. XSD中IDREF和IDREFS有什么区别?
- 22. COM中IDispatch和IUnkown有什么区别?
- 23. 在JavaScript中,'\'和'\ n'有什么区别?
- 24. =和在mysql中有什么区别?
- 25. Lisp中'和#'有什么区别?
- 26. 在Ember.js中,[]和Ember.A([])有什么区别?
- 27. VB6中Sub和Function有什么区别?
- 28. C++中#import和#include有什么区别?
- 29. printf中%c和%C有什么区别?
- 30. wordpress中is_page()和is_paged()有什么区别?
在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