Строковый предикат в Swi-Prolog

Я хотел бы знать, для чего именно используется строковый предикат в Swi-прологе? Пример и определение упоминаются здесь: http://www.swi-prolog.org/pldoc/doc_for?object=string/1 Но я никогда не пробовал ничего и не возвращал true, поэтому мне было интересно, может ли кто-нибудь дать мне более подробную информацию, а также предоставить пример, где он возвращает true и false, чтобы найти различия ?

Спасибо,


person Yasmin    schedule 18.08.2013    source источник


Ответы (2)


Строки - это в основном атомы, которые не входят в таблицу атомов. Наличие строк дает небольшое преимущество, поскольку таблица атомов в основном используется для вызова предикатов и не очень полезна, когда у вас много различных атомов.

Потребность в строках в последнее время немного уменьшилась, поскольку некоторые системы 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].
person Mostowski Collapse    schedule 18.08.2018
comment
В некоторых системах Prolog вообще нет таблицы атомов. Какой Пролог вы имеете в виду? - person false; 21.08.2018
comment
В Jekejeke Prolog нет глобальной таблицы атомов, поэтому для atom_codes / 2 потребуется свериться с этой таблицей. Только таблица предикатов, но не таблица атомов. Поиск предикатов организован локально на сайте вызова в полиморфных кэшах. Информацию о полиморфном встроенном кэшировании см. Также: Урс Хёльзле, Адаптивная оптимизация для самостоятельной работы - person Mostowski Collapse; 21.08.2018
comment
Итак, объединение двух атомов - это непостоянная операция. Да? - person false; 21.08.2018
comment
А с atom_chars/2 вы заново создаете все символы / атомы длины 1? - person false; 21.08.2018
comment
@false писал Итак, объединение двух атомов - это не постоянная операция. . Это ключевой вопрос. foo(36'hello_etc_) и foo('hello',_etc_) в идеале должны иметь одинаковую эффективность. Java в основном предоставляет интернированные строки (атомы .a.k.a.) Бесплатно, поэтому j4n bUrs3 не имеет ничего продуктивного в этом отношении (вероятно). - person Kintalken; 10.11.2019

Думаю, вам следует прочитать страницу, которая описывает, что такое строки и почему их тоже нужно использовать:

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

Другими словами, вы можете использовать встроенные функции для создания строк. Они отличаются от других типов, потому что другие типы не являются строками? ...

person Community    schedule 19.08.2013