Начало и конец рекурсии Prolog

#recursion #prolog

#рекурсия #пролог

Вопрос:

Я должен запросить базу данных, чтобы найти братьев и сестер детей, у которых есть по крайней мере два других брата и сестры, а также напечатать имена их родителей.

Это то, что у меня пока есть:

 queryQuestion3(Year,FatherName,MotherName):-
      family(person(FatherName,_,_,_),
             person(MotherName,_,_,_),
             [person(Name,Surname,date(_,_,Year),_),_,_|_])
   ;  family(person(FatherName,_,_,_),
             person(MotherName,_,_,_),
             [_,person(Name,Surname,date(_,_,Year),_),_|_])
   ;  family(person(FatherName,_,_,_),
              person(MotherName,_,_,_),
             [_,_,person(Name,Surname,date(_,_,Year),_)|_]).
  

Это работает, и это дает мне имена родителей, но это дает мне только первые три брата и сестру, и мне приходится иметь дело с семействами больше, чем это, без жесткого кодирования.
Я могу представить, что в ответе будет использоваться рекурсия, начиная с первого родственного элемента и повторяя их, пока вы не дойдете до последнего, базового варианта, а затем перейдете к следующему семейству, но я новичок в Prolog и не был бы очень уверен, как эффективно использовать рекурсию tail и head для достижения этого.

* Обновление # 2 *

Спасибо за ответ. Теперь вот код.

 queryQuestion3(Year,FatherName,MotherName):-
   family(person(FatherName,_,_,_),person(MotherName,_,_,_), Children),
   member(person(_,_,date(_,_,Year),_), Children).
  

Комментарии:

1. family(person(FatherName,_,_,_),person(MotherName,_,_,_), Children), member(person(_,_,date(_,_,Year),_) Кстати, Name и Surname не имеют к вам никакого отношения!

2. … И в вашей постановке задачи вы вообще не упоминаете Year .

3. Извините, только что заметил, что я не упомянул, что я должен указать год рождения всех братьев и сестер, а также имена их родителей. Спасибо, что обратили внимание на имя и фамилию! Ваш код очень полезен, и в нем перечислены все года рождения братьев и сестер и имена всех родителей, но теперь он включает все те семьи, у которых на двоих детей меньше. Я продолжаю получать бесконечный цикл всякий раз, когда пытаюсь его изменить. Новый код показан выше.

4. Я не вижу, где должен быть бесконечный цикл. Вероятно, ваши данные противоречивы.

5. Добавьте цель Children = [_,_,_|_] ограничить до 3 или более