#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 или более