string_concat / 3的实现

时间:2015-09-02 22:45:01

标签: prolog

要连接其他两个字符串,我知道谓词string_concat/3。但是,有人知道如何实现同样的谓词吗?

2 个答案:

答案 0 :(得分:0)

您可以使用string_codes/2strings转换为代码点列表。

?- string_codes("Hello, StackOverflow!", L).
L = [72, 101, 108, 108, 111, 44, 32, 83, 116|...].

?- string_codes(S, [97,98,99]).
S = "abc".

如果您想自己实施string_concat/3,那么您需要处理不同的案例:

  • 只有最后一个参数是免费的。
  • 只绑定最后一个参数。
  • 最后一个参数和前一个参数之一是绑定的。
  • 所有参数都受约束。

只需将输入字符串转换为代码点列表,使用append/3连接列表,然后将结果转换回字符串。您唯一需要注意的是在没有实例化变量的情况下不调用string_concat/2

答案 1 :(得分:0)

我知道在Stack Overflow上不赞成指出它,但仍然:你问的是错误的问题

SWI-Prolog中字符串的主要原因是允许表示不需要表示为正确的Prolog列表的“文本”。对文本使用“字符串”更节省空间,使用可用谓词对字符串执行某些操作比使用代码列表或原子执行相同操作更有效。

但是在原生Prolog中编写自己的谓词来操纵在底层语言中实现的不透明数据类型有点......不必要吗?

请务必阅读Representing text上手册中的部分。