Prolog 字符串_upper/2的替代方案

Prolog 字符串_upper/2的替代方案,prolog,swi-prolog,Prolog,Swi Prolog,由于某种原因,我的代码应该使用的机器不知道谓词string\u upper/2。还有其他选择吗?最后,这个谓词的代码是什么样子的?将字符串分解为字符代码列表。然后,如果需要,在重构字符串之前,将这些代码转换为适当的大写代码。更完整的答案需要知道您使用的是哪一个prolog,它的可用谓词,以及它如何表示字符串 您可能希望了解不同的Prolog对字符、Unicode和字符串的处理。为此,SWI Prolog实现提供了一些很好的文档: 传统(爱丁堡)、ISO和SWI prolog如何处理字符: IS

由于某种原因,我的代码应该使用的机器不知道谓词
string\u upper/2
。还有其他选择吗?最后,这个谓词的代码是什么样子的?

将字符串分解为字符代码列表。然后,如果需要,在重构字符串之前,将这些代码转换为适当的大写代码。更完整的答案需要知道您使用的是哪一个prolog,它的可用谓词,以及它如何表示字符串


您可能希望了解不同的Prolog对字符、Unicode和字符串的处理。为此,SWI Prolog实现提供了一些很好的文档:

传统(爱丁堡)、ISO和SWI prolog如何处理字符:

ISO和SWI序言如何支持Unicode


SWI如何拥有使用引号表示的特定字符串类型对象:

您在注释中给出的示例实际上不是字符串,而是一对原子。由于您已经选择使用
upcase\u atom/2
,在您从帖子中删除的代码中,我要指出,这个内置函数只在一个方向上起作用,即如果第一个参数是原子的。考虑下面的查询:

?- upcase_atom(bo,'BO').   % Is 'BO' the uppercase version of bo?
true.                      % Yes, it is.

?- upcase_atom(bo,B).      % What's the uppercase version of bo?
B = 'BO'.                  % It's 'BO'

?- upcase_atom(B,'BO').    % What atom has 'BO' as uppercase version?
ERROR: upcase_atom/2: Arguments are not sufficiently instantiated

?- upcase_atom(B,1).       % What atom has 1 as uppercase version?
ERROR: upcase_atom/2: Arguments are not sufficiently instantiated
从已删除代码中的示例查询是
?-divideIt(a-b)。
。原子
a
与规则
divideIt/1
头部的变量
V
统一。然后Prolog调用第一个目标
upcase\u atom(V,ve)
,该目标必须失败,因为atom
ve
不是atom
a
的大写版本。因此,您的示例查询也会失败。如果对谓词应用以下细微更改,则会产生所需的结果:

divideIt(V-W) :-
   upcase_atom(V,Ve),     % <- Ve (=variable) instead of ve (=atom)
   write(Ve),
   write('-'),            % <- '-' instead of "-"
   upcase_atom(W,We),     % <- We (=variable) instead of we (=atom)
   write(We).

?- divideIt(a-b).
A-B
true.
divideIt(V-W):-

upcase_atom(V,Ve),%我的字符串看起来像
a-b
。实际上我不确定那是不是一根绳子。这是什么机器?什么序言?