Если можно сделать приближение количества объектов, которые будут там в конце, использовать перегрузку Списка constuctor, который берет количество в качестве параметра. Вы сохраните некоторые дорогие дублирования Списка. Иначе необходимо заплатить за него.
Мой курс пролога был давным-давно, но как насчет удаления
parent(X,Y):-
child(Y,X).
и простой замены любого использования parent (A, B)
на потомок (B, A)
? Вы все еще можете добавлять факты о родителях, потому что обратное правило все еще доступно - вы также можете удалить его, но в этом случае вы больше не сможете использовать какие-либо факты о родителях, и вам придется записывать все свои факты как ребенок (a, b) тоже.
Это то же самое, не правда ли?
Обратите внимание, что мои знания Prolog старые (и никогда не настолько глубокие). ..
Я думаю, вам нужно сделать родительский (или дочерний) первичным (не зависящим от других отношений).
child(X,Y):-
parent(Y,X).
parent(X,Y):-
child(Y,X).
- это то, что, вероятно, вызывает петли.