Пролог Родословная Кровные отношения, Рекурсия?
Мне нужна рекурсивная функция, которая находит всех кровных родственников в родословной. Но я, честно говоря, понятия не имею, как реализовать это в Прологе.
Мое текущее понимание решения - поиск текущей ветви на предмет соответствия и переход к следующей ветви, если совпадений не будет.
Например:
Peter
Alf, Bert
Sam, Tom, George, Sally
Чтобы проверить, связаны ли Том и Сэм, мы просто проверяем первую ветвь, находя всех братьев и сестер (проверяя родителя и проверяя все дочерние элементы).
Эта логика затем применяется, когда мы перебираем дерево. Например, чтобы увидеть, связаны ли Салли и Том, сначала мы проверяем, являются ли они братьями и сестрами, если нет, то проверяем братьев и сестер своих родителей и так далее.
У меня есть предикаты, такие как двоюродный брат, дядя и т. Д., Которые могут проверять подобные вещи, но проблема в масштабируемости. Кажется нелогичным создавать предикаты для прапрадедушки, когда я мог бы просто использовать какую-то рекурсию, чтобы проверить, связаны ли они с кровью.
Заранее спасибо:)
Редактировать:
Вот некоторые основные факты / предикаты, чтобы проиллюстрировать угол, с которого я подхожу:
woman(sally).
woman(betty).
man(john).
man(tom).
parent(tom, john).
parent(sally, betty).
sibling(A, B) :-
parent(C, A),
parent(C, B),
A \= B.
У меня есть больше, что я использую для дерева, но я не думаю, что они имеют отношение к этому вопросу.