The winner takes it all
Нужно написать предикат для пролога, не получается... Нужно, чтобы со мной подумали вместе... Чистая логика.
Дано:
читать дальше
Подумаем, вместе? Вдруг кому интересно.
Дано:
читать дальше
Подумаем, вместе? Вдруг кому интересно.
Я бы изменил имя предиката на естьСестра(X), иначе можно подумать, что сестра(X) это предикат который проверяет элемент X сестра ли это. То есть выдаётся список женщин, которые чьи-то сёстры.
Не совсем понял проблему, вы хотите распечатать список людей (мужского или женского пола) у которых есть сестра?
Нужно распечатать список людей мужского пола, у которых есть сестра.
Update: расписал более аккуратно с учётом, что может быть Y = X.
естьСестра(X) := родитель(Z, X), родитель(Z, Y), пол(Y, ж), пол(X, м)
Допустим есть такая БД:
родитель(Ира, Миша)
родитель(Ира, Катя)
пол(Миша, м)
пол(Катя, ж)
Прогоним наш предикат естьСестра(X). Для X = Миша
родитель(Z, X) = родитель(Ира, Миша) = true
родитель(Z, Y) = родитель(Ира, Миша) = true
пол(Миша, ж) = false. Провал.
родитель(Z, X) = родитель(Ира, Миша) = true
родитель(Z, Y) = родитель(Ира, Катя) = true
пол(Y, ж) = пол(Катя, ж) = true
пол(X, м) = пол(Миша, м) = true.
Всё true, значит подстановка X = Миша удовлетворима и "миша" выводится на экран.
Теперь для X = Катя
родитель(Z, X) = родитель(Ира, Катя) = true
родитель(Z, Y) = родитель(Ира, Катя) = true
пол(Y, ж) = пол(Катя, ж) = true
пол(X, м) = пол(Катя, м) = false. Провал.
родитель(Z, X) = родитель(Ира, Катя) = true
родитель(Z, Y) = родитель(Ира, Миша) = true
пол(Y, ж) = пол(Миша, ж) = false. Провал.
Всевозможные подстановки исчерпаны, значит на выходе:
Миша.
То есть то что нам нужно.
Покажите вашу БД.
parent(jelizaveta,vladimirs).
parent(aleksandra,irina).
parent(germans,irina).
parent(vladimirs,svetlana).
parent(vladimirs,liana).
parent(irina,svetlana).
parent(irina,liana).
parent(svetlana,angelica).
parent(svetlana,elisabeth).
dzim(jelizaveta,siev).
dzim(konstantins,vir).
dzim(aleksandra,siev).
dzim(germans,vir).
dzim(vladimirs,vir).
dzim(irina,siev).
dzim(svetlana,siev).
dzim(liana,siev).
dzim(angelica,siev).
dzim(elisabeth,siev).
P.S.: vir = м, siev= ж
Список должен быть пустым. Мужчин у которых есть сёстры - нет.
Что у вас выдаёт? Попробуйте нарисовать иерархию отношений.
спасибо за помощь, а то что-то я была не совсем уверена в своей правоте... мало ли почему он может false выдавать...
Пожалуйста ). Можно ещё проверку X на мужской пол первой поставить, чтобы например для естьСестра(Катя) несчастный интерпретатор не скакал по списку выясняя все остальные предикаты, а потом обламывался на пол(Катя, м) ).
Ещё советую провести контрольный эксперимент, т.е. добавь запись:
parent(vladimirs, olaf)
dzim(olaf,vir).
И запусти hasSister(X). Должно выплюнуть olaf.