【问题标题】:Prolog - List of CharCodes to a String or CharactersProlog - 字符串或字符的 CharCode 列表
【发布时间】:2012-11-20 04:24:38
【问题描述】:

我在序言中有一个字符代码列表。

我想把它们变成字符。

例如,

L = "abc" 返回L = [97,98,99]

假设我从L = [97,98,99]开始

如果存在方法,是否可以将 L 转换回 abc

convert(L, X) 返回X = abc

谢谢。

【问题讨论】:

    标签: list character-encoding prolog character


    【解决方案1】:

    鉴于L="abc", convert(L, X), X = abc 我想说你想从序言字符串中获取原子(参见Data types description)。 我猜你想要atom_codes/2 或类似的东西。根据文档,它应该像L="abc", atom_codes(X, L). 一样工作。

    不幸的是,目前我的系统中没有 SWI-Prolog。但这里是YAP,其中包含atom_codes/2

    YAP 6.3.2 (x86_64-linux): Sat Sep  1 08:24:15 EEST 2012
    MYDDAS version MYDDAS-0.9.1
    ?- L="abc", atom_codes(X,L).
    L = [97,98,99],
    X = abc
    

    不要忘记,如果您需要输出字符串,则不需要将其转换为 atom。见format/2 in SWI(或in YAP

    ?- L="abc", format("~s~n", [L]).
    abc
    L = [97,98,99]
    

    【讨论】:

      【解决方案2】:

      在地图列表中使用char_code(?Atom, ?ASCII)

      char_code(?Atom, ?ASCII) 在字符和 ASCII 值之间转换 单个字符。 (16)

      Source

      【讨论】:

        【解决方案3】:

        字符表示为长度为 1 的原子。您可以生成它们:

        • 在读取时通过更改 Prolog 标志 double_quotes。有关更多信息,请参阅 thisthat 链接。

          :- set_prolog_flag(double_quotes, chars).
          
        • 动态地,您可以使用atom_codes/2atom_chars/2。或者你可以直接使用char_code/2

        【讨论】:

        • 我认为原子是一种抽象标识符,除了如果标识符不同,它们就不同。转换为字符串并返回更像是查找关联,而不是拆卸和组装。还有一些 Prolog 系统(至少是 YAP 和一个有问题的系统)可以将字符串表示为字符代码(数字)列表。虽然我同意数字可能被视为原子的子集(与列表/结构相反的类型),但它们的可见字符标识符通常比一个字符长。
        • @ony:同样在 YAP 中,您可以声明:set_prolog_flag(double_quotes, chars),然后 "abc"[a,b,c]。一般来说,这种表示比[97, 98, 99]更具可读性。
        • 在“可能”下我的意思是他们可能代表。顺便说一句,我不确定这种表示是否更兼容。 YAP 6.3.3 根本无法理解以这种方式表示的文本。试试L="abc", format("~s~n", [L]).,你会看到它报错TYPE ERROR- format/3: expected text, got [~,s,~,n]。所以我觉得某些 Prolog 系统的开发人员将字符以数字表示作为默认行为是有原因的。
        • 尝试 6.3.4。除此之外,format('~s~n',[L]) 更可取。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        • 2013-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多