Prolog 当前\u序言\u标志双引号DCG(代码或字符)?

Prolog 当前\u序言\u标志双引号DCG(代码或字符)?,prolog,flags,dcg,Prolog,Flags,Dcg,在使用SWI-Prolog-DCGs时,我注意到一些人注意到 :- set_prolog_flag(double_quotes, codes). 其他人注意到 :- set_prolog_flag(double_quotes, chars). , 与DCG和短语一起使用时有什么区别(如果有的话) 工具书类 正如名称双引号所暗示的那样,此标志影响双引号(即:“)的处理方式 这决定了此类引号是否用于DCGS。但是,它在DCGS中特别有用,因为您可以使用: ?- phrase(nt(NT

在使用SWI-Prolog-DCGs时,我注意到一些人注意到

:- set_prolog_flag(double_quotes, codes).

其他人注意到

:- set_prolog_flag(double_quotes, chars).
,

与DCG和短语一起使用时有什么区别(如果有的话)

工具书类




正如名称
双引号
所暗示的那样,此标志影响双引号(即:
)的处理方式

这决定了此类引号是否用于DCGS。但是,它在DCGS中特别有用,因为您可以使用:

?- phrase(nt(NT), "test"). 与带有
代码的情况相比:

?- Xs = "hello". Xs = [104, 101, 108, 108, 111]. ?-Xs=“你好”。 Xs=[104101108108111]。 (啊哼。)

从历史上看,chars是第一位的!只是后来,默认情况下改为使用代码。在myview中,这是一个非常不幸的选择。其他语言(如Haskell)的工作方式与Prolog OriginallyId类似:

Hugs> :t last last :: [a] -> a Hugs> :t "test" "test" :: String Hugs> last "test" 't' 拥抱>:t持续 最后::[a]->a 拥抱>:t“测试” “测试”::字符串 拥抱>最后一次“测试” “不”
我在哪里认可过
代码
?我说:这通常是默认的,但它会导致非常难以理解的答案。通过什么共谋,这可以被视为偏好/建议,更不用说认可了?@false我更改了它。正如我经常注意到的,这都是CC,所以请随意更改它。有趣的是:SWI Prolog-代码可以在算术中使用我相信你知道这一点,但它被认为是Haskell最明显的缺陷之一,因为Haskell中的字符串实际上是字符的链接列表(除非你使用ByTestring或Text)。这只意味着必须有人实施优化,以提高Haskell运行时中字符串内部表示的效率。当然,不能认为在应用程序级别对字符串进行如此自然的推理是一个缺陷,不是吗?我对内部结构不太了解,无法发表评论,但我不会假设你的建议很容易做出改变。我确信这不是一件容易的事,也不是一个大问题。尽管如此,我认为Haskell方法比其他系统所做的要好得多,比如:这很难,所以让我们打破一些其他的东西,而不是正确地去做。我认为忠实于优雅的原则并不是一个缺陷我不认为这个特定的问题本身会让Haskell退缩太多,尽管我当然可以想象它可能成为问题的用例。 Hugs> :t last last :: [a] -> a Hugs> :t "test" "test" :: String Hugs> last "test" 't'