domains
child=string*
name,fami,otch=string
man,woman=s(name,fami,otch)
fam=f(man,woman,child)
slist=fam*
predicates
family(fam)
vvodFamily(fam)
vvod(slist, slist)
dobavElSpisok(child,child)
reshenie(slist)
bezchilFamily(fam,slist)
prinad(fam,slist)
findFam(slist,slist)
clauses
family(f(s("Ivan","Sidorov","Ivanovich"),s("Mariya","Ivanova","Viktorovna"),["Kolya"])).
family(f(s("Petr","Ivanov","Stepanovich"),s("Nina","Ivanova","Olegovna"),["Pavel","Irina"])).
family(f(s("Anatoliy","Kolesnikov","Maratovich"),s("Juliya","Kolesnilova","Damirovna"),[])).
family(f(s("Timur","Kharisov","Ildarovic"),s("Evgeniya","Kharisova","Sergeevna"),["Stepan"])).
family(f(s("Pavel","Kondrashov","Anatolevich"),s("Aleksandra","Kondrashova","Nikolaevna"),[])).
vvod(L1,L2):-write("Do you want to add new family? (y/n)"), readchar(C),nl, C='y',!, vvodfamily(Z), vvod([Z|L1],L2).
vvod(L1,L1).
vvodFamily(f(s(X,Y,Z),s(X1,Y1,Z1),L)):-write("Vvedite father's name:"),readln(X),write("vvedite father's sirname:"),readln(Y),write("vvedite father's otchestvo:"),readln(Z),nl,
write("Vvedite mother's name:"),readln(X1),write("vvedite mother's sirname:"),readln(Y1),write("vvedite mother's otchestvo:"),readln(Z1), dobavElSpisok([],L),!.
vvodFamily(f(s(X,Y,Z),s(X1,Y1,Z1),L)):-write("Oshibka vvoda. Povtorite"), readln(_),vvodFamily(f(s(X,Y,Z),s(X1,Y1,Z1),L)).
dobavElSpisok(L1,L2):-write("Budete vvodit detei(y/n)?"), readchar(C), nl, C='y',write("vvedite name:"),readln(Z), dobavElSpisok([Z|L1],L2).
dobavElSpisok(L,L).
reshenie(LL):-findall(Q,family(Q),L0), vvod(L0,L1), findFam(L1,LL).
bezchilFamily(f(X,Y,L1),L):-L1=[],prinad(f(X,Y,L1),L).
prinad(X,[X|L1]).
prinad(X,[X1|L1]):-prinad(X,L1).
findFam(L1,L2):-findall(Q,bezchilfamily(Q,L1), L2).