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