Пролог Родословная Кровные отношения, Рекурсия?

Мне нужна рекурсивная функция, которая находит всех кровных родственников в родословной. Но я, честно говоря, понятия не имею, как реализовать это в Прологе.

Мое текущее понимание решения - поиск текущей ветви на предмет соответствия и переход к следующей ветви, если совпадений не будет.

Например:

           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.

У меня есть больше, что я использую для дерева, но я не думаю, что они имеют отношение к этому вопросу.

0 ответов

Другие вопросы по тегам