t、 是典型煽动家的武器之一。如果你不是故意的,那么你应该更小心地避免它。这是一条建议:请参阅(“小心谁的建议…”)的最后第二段。lazy\u list\u character\u count/1是pio的一个补充,它违反了pio的一个原始属性:它可以以完

t、 是典型煽动家的武器之一。如果你不是故意的,那么你应该更小心地避免它。这是一条建议:请参阅(“小心谁的建议…”)的最后第二段。lazy\u list\u character\u count/1是pio的一个补充,它违反了pio的一个原始属性:它可以以完,io,prolog,instantiation-error,Io,Prolog,Instantiation Error,t、 是典型煽动家的武器之一。如果你不是故意的,那么你应该更小心地避免它。这是一条建议:请参阅(“小心谁的建议…”)的最后第二段。lazy\u list\u character\u count/1是pio的一个补充,它违反了pio的一个原始属性:它可以以完全相同的方式用于文件以及常规引用列表,无论它们是字符还是代码。//0是一个自然的选择,这也是一个人在没有序言的情况下编写的内容。。。对于//1,不确定..(5)看起来不太好。使用的开销是什么:read\u atom(S,A):-read\u s


t、 是典型煽动家的武器之一。如果你不是故意的,那么你应该更小心地避免它。这是一条建议:请参阅(“小心谁的建议…”)的最后第二段。
lazy\u list\u character\u count/1
是pio的一个补充,它违反了pio的一个原始属性:它可以以完全相同的方式用于文件以及常规引用列表,无论它们是字符还是代码。
//0
是一个自然的选择,这也是一个人在没有序言的情况下编写的内容。。。对于
//1
,不确定
..(5)
看起来不太好。使用的开销是什么:
read\u atom(S,A):-read\u string(S,Str),atom\u string(A,Str)。
?我无法测量差异。@false几乎没有任何差异。正如您所知,原因是在SWI Prolog中实现的“字符串”非常节省空间和时间(请阅读“C中的实现”),从字符串到atom的转换可能只意味着获取C字符串的散列,以便引擎可以对其进行索引(原子是指标识符,而不是文本的持有者)。当然,简·维莱马克比我更了解血腥的细节。总而言之,由于字符串的实现,将一个字符串转换为atom的开销非常小。换言之:当atom完全提供该功能时,没有理由使用字符串(作为可见的数据类型)。@false我明白了你的意思:)字符串的唯一参数(非常强的参数IMHO)如果程序中有足够多的“文本”,字符串作为表示“文本”的非常容易泄漏的抽象是否会产生影响。当然,这可以通过改变处理系统中原子的方法来实现。我看不出当前的情况有多大的破坏性:至少,它为在大规模程序中尝试不同的“文本”处理提供了一个平台,而且肯定会有有用的教训可以吸取。这种情况是破坏性的,因为双引号被用作它们的“规范”表示。它也具有破坏性,因为一整套新的(实际上未经测试的)内置组件现在正在降低稳定性。最初,SWI的atom管理相对较差,严重阻塞了线程。现在已经不是这样了。
process2(Text,POS):-
    open('houses.txt', read, In),
    get_char(In, Char1),
    find(Char1, In,Text,POS),
    close(In).

find(Text,In, Text, 0).
find(Char,In,Text,POS) :-
    POS is POS1 +1,
    get_char(In, Char2),
    find(Char2,In,Text,POS1).
:- use_module(library(pio)). process3(File, Text, POS) :- phrase_from_file(find(Text, POS), File). find(Text, [P|Ps]) --> lazy_list_character_count(P), Text, !, find(Text, Ps). find(Text, Ps) --> [_], find(Text, Ps). find(_Text, []) --> [].
?- process3('/home/carlo/.swiplrc', `file`, P).
P = [51, 174, 254, 452, 549, 1977, 2106, 3682, 4033|...] ;
false.
find(_Text, []) --> [].
find(Text, [P|Ps]) -->
    lazy_list_character_count(P), Text,
    find(Text, Ps).
find(Text, Ps) --> \+Text, [_], find(Text, Ps).
:- use_module(library(clpfd)).

find(Text, In, Text, 0).
find(Char, In, Text, POS) :-
        POS #= POS1 + 1,
        get_char(In, Char2),
        find(Char2,In,Text, POS1).
:- use_module(library(pio)).

... --> []|[_], ... .

file_pattern_pos(File, Pattern, Pos) :-
    phrase_from_file(( ...,
                       lazy_list_character_count(Pos),
                       Pattern,
                       ...
                     ),
                     File).
$ cat banana.txt
banana
Antananarivo
?- file_pattern_pos("banana.txt", "ana", Pos).
Pos = 1 ;
Pos = 3 ;
Pos = 10 ;
Pos = 12 ;
false.
?- bagof(P, file_pattern_pos("banana.txt", "a", P), Ps).
Ps = [1, 3, 5, 10, 12, 14].
... --> [].
... --> [_], ... .
span(N) --> span_(0, N).

span_(N, N) --> [].
span_(N0, N) --> [_],
    {   N1 is N0 + 1
    },
    span_(N1, N).
?- phrase_from_file(( span(Pos), "ana", ... ), "banana.txt").
Pos = 1 ;
Pos = 3 ;
Pos = 10 ;
Pos = 12 ;
false.
?- phrase((span(P), "ana", ...), "banana").
P = 1 ;
P = 3 ;
false.
setup_call_cleanup(open(File, read, In),
                   read_string(In, _, File_contents),
                   close(In)),
sub_string(File_contents, Pos, _Length, _After, Substr)
?- sub_string("banana", Pos, _, _, "ana").
Pos = 1 ;
Pos = 3 ;
false.
?- sub_atom(banana, Pos, _, _, ana).
Pos = 1 ;
Pos = 3 ;
false.