string - Prolog 将字符串转换为其 ascii 数值
问题描述
我是序言的新手。我试图实现以下结构:equ([v(_Val,_Name)])
.
我试图写以下内容:add(Eq,equ([]),Eq).
我想使用以下测试:add(equ([v(1.0,"x")]),equ([]),L).
预期的输出是:L = equ([v(1.0,"x")]).
我得到的输出:L = equ([v(1.0,[120])]).
出于某种原因,它将字符串转换"x"
为它的 ascii 值 a 将其放入列表中:[120]
。
为什么会这样,我怎样才能将它保存为字符串?
解决方案
标准 Prolog 不支持字符串。它定义了一个标志 ,它定义了double_quotes
双引号之间文本的解释。标志的可能标准值是codes
、chars
和atom
。该codes
值意味着"x"
被解释为字符代码列表,从而为您提供观察到的结果。您可以通过以下查询确认:
| ?- current_prolog_flag(double_quotes, Value).
它很可能会返回绑定:
Value = codes
但请注意,在您的具体示例中,您可以简单地编写:
add(equ([v(1.0,x)]),equ([]),L).
如果您的字符串可能以大写字母开头或包含例如空格或标点符号,那么一个选项是将文本括在单引号之间,使其成为 Prolog atom。例如:
add(equ([v(1.0,'Foo bar.')]),equ([]),L).
atom
您还可以使用查询将标志的值更改为:
| ?- set_prolog_flag(double_quotes, atom).
但该值codes
是唯一一个真正可跨 Prolog 实现移植的值。一些 Prolog 系统,例如 ECLiPSe 和 SWI-Prolog 确实支持字符串类型。检查您正在使用的系统的文档。
推荐阅读
- python - Holoview,更改图表的样式选项
- laravel-5 - 管理员创建用户,不希望用户在管理员使用 Laravel 的默认身份验证系统注册后自动登录
- c++ - 为什么 CoCreateInstance 可以在完全相同的上下文中返回两个不同的 HRESULT?
- css - 状态更改时如何将css文件从服务器添加到角度组件
- asp.net - 如何将 API 数据中的图形显示到 Umbraco?
- javascript - 未捕获的类型错误:document.getElementByTagName 不是函数
- firebase - 'eslint' 不是内部或外部命令、可运行程序或批处理文件
- graphql - GraphQL:如何让它返回一个灵活的动态数组,这取决于营销人员填写的内容?
- r - 强制 .GRP 计数器从 data.table 中的 2 而不是 1 开始
- javascript - 如何将 javascript 缓冲区转换为 c/c++ API 的字节数组?