LINUX.ORG.RU

Ругается потому что результаты унификации не сохраняются между запросами. Надо так:

?- new_table('/etc/passwd',
             [ user(atom),
               passwd(code_list),
               uid(integer),
               gid(integer),
               gecos(code_list),
               homedir(atom),
               shell(atom)
             ],
             [ field_separator(0':)
             ],
             H), findall(User, in_table(H, [user(User), gid(100)], _), Users).

anonymous
()
Ответ на: комментарий от anonymous

Спасибо! Что то не очень удобно такие внешние таблицы использовать :( Это каждый раз определять все внешние таблицы получается надо в операторе который к ним обращается :( (или если new_table() будет внутри pl скомпилированного, то всё будут нормально?)

А как вообще кошерным образом сделать факты из таблиц хранимых в файлах?

psv1967 ★★★★★
() автор топика
Ответ на: комментарий от psv1967

Зачем каждый? Один раз открыл и таскай этот хендл с собой куда надо.

А как вообще кошерным образом сделать факты из таблиц хранимых в файлах?

А почему просто подтянуть их все в базу нельзя?

anonymous
()
Ответ на: комментарий от anonymous

Зачем каждый? Один раз открыл и таскай этот хендл с собой куда надо.

а как этот H сохраняется?

?- new_table('/etc/passwd',
|                 [ user(atom),
|                   passwd(code_list),
|                   uid(integer),
|                   gid(integer),
|                   gecos(code_list),
|                   homedir(atom),
|                   shell(atom)
|                 ],
|                 [ field_separator(0':)
|                 ],
|                 H).
H = 139222064.

?- in_table(H, [user(User), gid(100)], _).
ERROR: Type error: `table' expected, found `_G1801'

или new_table() надо выполнить как pl файл и тогда H будет доступен в репле?

2. вот такого стиля хочется избежать

https://github.com/kdevalck/Prolog/blob/master/city_new.pl

«руками» генерить базу фактов. Хочется данные хранить во внешних таблицах и подгружать превращая в факты на лету (ну или пусть один раз, но всё равно из таблиц). Так кажется намного удобнее поставлять данные для обработки прологом.

psv1967 ★★★★★
() автор топика
Ответ на: комментарий от psv1967

заюавный репл :)

?- new_table('/etc/passwd',
|                 [ user(atom),
|                   passwd(code_list),
|                   uid(integer),
|                   gid(integer),
|                   gecos(code_list),
|                   homedir(atom),
|                   shell(atom)
|                 ],
|                 [ field_separator(0':)
|                 ],
|                 H)
|    .
H = 166763776.

?- findall(User, in_table($H, [user(User), gid(100)], _), Users).
Users = [].

?- findall(User, in_table($H, [user(User), gid(_)], _), Users).
Users = [root, daemon, bin, sys, sync, games, man, lp, mail|...].

psv1967 ★★★★★
() автор топика
Ответ на: комментарий от psv1967

Ну вот, например, тебе самый топорный способ, сохранить хендл в базе, тогда его в любой момент можно достать:

?- new_table(..., H), assert(mytable(H)).
?- mytable(T), in_table(T, ...).

По второму пункту, я не вижу в чем проблема. Если просто формат не нравится, можно парсить файл в каком там тебе формате удобно, формировать термы и так же загонять их по одному в базу assert'ом.

anonymous
()
Ответ на: комментарий от anonymous

а вот такой способ насколько выглядит правильно?

?- use_module(library(csv)).
%  library(record) compiled into record 0.00 sec, 68 clauses
%   library(option) compiled into swi_option 0.00 sec, 32 clauses
%  library(pure_input) compiled into pure_input 0.00 sec, 45 clauses
%  library(debug) compiled into prolog_debug 0.00 sec, 55 clauses
% library(csv) compiled into csv 0.02 sec, 329 clauses
true.

?- csv_read_file('t.csv', Rows, [functor(table), arity(3)]),maplist(assert, Rows).
Rows = [table(1, 2, 3), table(4, 5, 6)].

?- listing.

:- thread_local thread_message_hook/3.
:- dynamic thread_message_hook/3.
:- volatile thread_message_hook/3.


:- dynamic table/3.

table(1, 2, 3).
table(4, 5, 6).
true.

?- 

или надо потом еще table каким то образом в статику перегнать?

psv1967 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

в моем случае


?- compile_predicates([table/3]).
true.

?- listing.

:- thread_local thread_message_hook/3.
:- dynamic thread_message_hook/3.
:- volatile thread_message_hook/3.


table(1, 2, 3).
table(4, 5, 6).
true.

?- assert(table(7,8,9)).
ERROR: assert/1: No permission to modify static procedure `table/3'

а насколько это поднимает производительность? в примечании не очень отчетливо написано. текущая версия swi prolog получает прирост и насколько значимый?

psv1967 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.