The winner takes it all
Нужно написать предикат для пролога, не получается... Нужно, чтобы со мной подумали вместе... Чистая логика.

Дано:
читать дальше

Подумаем, вместе? Вдруг кому интересно.

Комментарии
02.10.2009 в 23:50

Don't stop the music.
.Amira.
Я бы изменил имя предиката на естьСестра(X), иначе можно подумать, что сестра(X) это предикат который проверяет элемент X сестра ли это. То есть выдаётся список женщин, которые чьи-то сёстры.

Не совсем понял проблему, вы хотите распечатать список людей (мужского или женского пола) у которых есть сестра?
02.10.2009 в 23:53

The winner takes it all
ок, пусть будет естьСестра(X) :)

Нужно распечатать список людей мужского пола, у которых есть сестра.
03.10.2009 в 00:04

Don't stop the music.
Гм, должно работать.

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. Провал.


Всевозможные подстановки исчерпаны, значит на выходе:

Миша.

То есть то что нам нужно.

Покажите вашу БД.
03.10.2009 в 00:09

The winner takes it all
parent(konstantins,vladimirs).
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= ж
03.10.2009 в 00:37

Don't stop the music.
.Amira.
Список должен быть пустым. Мужчин у которых есть сёстры - нет.

Что у вас выдаёт? Попробуйте нарисовать иерархию отношений.
03.10.2009 в 00:41

The winner takes it all
Слушатель в принципе выдаёт false...

спасибо за помощь, а то что-то я была не совсем уверена в своей правоте... мало ли почему он может false выдавать...

:red:
03.10.2009 в 03:14

Don't stop the music.
.Amira.

Пожалуйста ). Можно ещё проверку X на мужской пол первой поставить, чтобы например для естьСестра(Катя) несчастный интерпретатор не скакал по списку выясняя все остальные предикаты, а потом обламывался на пол(Катя, м) ).

Ещё советую провести контрольный эксперимент, т.е. добавь запись:
parent(vladimirs, olaf)

dzim(olaf,vir).

И запусти hasSister(X). Должно выплюнуть olaf.