2

我想知道 Swi-prolog 中的字符串谓词到底是用来做什么的?这里提到了示例和定义: http ://www.swi-prolog.org/pldoc/doc_for?object=string/ 1 但我从未尝试过并返回true,所以我想知道是否有人可以给我更详细和还提供返回 true 和 false 以查找差异的示例?

谢谢,

4

2 回答 2

0

我想您也应该阅读描述什么是字符串以及为什么要使用它们的页面:

http://www.swi-prolog.org/pldoc/man?section=strings

这对我来说看起来很详细。以下是一些字符串:

?- string_to_atom(String, foobar), string(String).
String = "foobar".

?- string_to_list(String, [104,109,109]), string(String).
String = "hmm".

换句话说,您可以使用字符串内置函数来制作字符串。它们与其他类型不同,因为其他类型不是字符串?...

于 2013-08-19T07:19:39.193 回答
0

字符串基本上是不进入原子表的原子。有字符串有一点好处,因为原子表主要用于调用谓词,但当你有许多不同的原子时不是很有用。

最近对字符串的需求有所减少,因为一些 Prolog 系统还具有原子表垃圾收集功能。一些 Prolog 系统甚至根本没有原子表。

这是一个查看原子性能的简单测试用例,如果存在原子表垃圾收集或 Prolog 系统没有原子表,它们通常可以用来代替字符串。

SWI-Prolog 原子,一些原子表 GC:

?- time(test).
% 8,209,791 inferences, 1.125 CPU in 1.140 seconds (99% CPU, 7297592 Lips)
false.

SWI-Prolog 字符串:

?- time(test2).
% 8,209,791 inferences, 0.750 CPU in 0.749 seconds (100% CPU, 10946388 Lips)
false.

Jekejeke Prolog 原子,没有原子表:

?- time(test).
% Up 1,398 ms, GC 14 ms, Thread Cpu 1,360 ms (Current 08/18/18 20:35:56)
No

所以我猜字符串有一些影响。也许比 SWI-Prolog 字符串更好的解决方案是可以根据需要自动用作字符串的原子,就像在 Jekejeke Prolog 中一样。这将大大减少内置插件的数量。

PS:我使用了以下测试代码:

test :- 
   between(1,127,A), between(1,127,B), between(1,127,C), 
   atom_codes(X,[A,B,C]), atom_codes(X, L), L\==[A,B,C].

test2 :- 
   between(1,127,A), between(1,127,B), between(1,127,C), 
   string_codes(X,[A,B,C]), string_codes(X, L), L\==[A,B,C].
于 2018-08-18T18:43:01.527 回答