Swi-Prolog中的字符串谓词

时间:2013-08-18 11:22:33

标签: swi-prolog

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

谢谢,

2 个答案:

答案 0 :(得分: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".

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

答案 1 :(得分: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。这将大大减少内置的数量。

P.S .:我使用了以下测试代码:

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].