быстрый способ поиска статических фактов с прологом SWI? - PullRequest
0 голосов
/ 19 августа 2011

Есть ли более быстрый способ компилировать или индексировать большое количество фактов для повышения скорости?У меня есть около 30 тысяч фактов в виде связанной формы (groupid, id)

и я пытаюсь найти соединения с данным идентификатором, но это действительно медленно.Я пользуюсь правилами

connected(Id1,Id2) :-
   linked(Grp1,Id1),
   linked(Grp1,Id2),
   \+Id1=Id2.

connected(Id1,Id2) :-
   connected(Id1,Id3),
   connectedId3,Id2),
   \+Id1=Id2,!.

С уважением

Ты

1 Ответ

2 голосов
/ 22 марта 2012

Большинство прологов используют индексацию по первому аргументу предиката, поэтому иногда может быть полезно изменить порядок аргументов. В некоторых диалектах Prolog, таких как SWI, вы можете явно указать, как индексирование должно выполняться с помощью директивы: -index.

Ваша реализация предлагает вариант транзитивного замыкания. Если Id1 и Id2 заземлены, вы можете рассмотреть различие между рекурсивным и нерекурсивным регистром (1) и заменой первого вызова connected / 2 в теле второго предложения на вызов нерекурсивного регистра (2). Наконец, вы можете отследить посещенные идентификаторы так, чтобы вам не нужно было их повторно посещать.

...