Помощь - Поиск - Пользователи - Календарь
Полная версия: Родственные отношения
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
18192123
Здравствуйте!

Таково содержимое базы:
Код

%факты
parent(petr,ivan). %petr - родитель для ivan
parent(petr,olga).
parent(lidia,ivan).
parent(ivan,sergey).
parent(ivan,oleg).
parent(oleg,inna).
%процедуры
ancestor(A,B):-parent(A,B).
ancestor(A,B):-parent(C,B),ancestor(A,C).
brother(A,B):-parent(C,A),parent(C,B). %A - это брат B, если у них один родитель

Проблема в том, что при, например, таком запросе (кто для ivan братья):
Код

?- brother(X,ivan).

X = ivan ,

X = olga ,

X = ivan ,
no

ivan сам себе получается братом...
подскажите пожалуйста, как подправить это? и ещё, как учесть, что может быть отношение брат, а может быть сестра..?
volvo
Цитата
ivan сам себе получается братом...
подскажите пожалуйста, как подправить это?
Проверять на неравенство:
Код
brother(A,B):-parent(C,A),parent(C,B),A<>B. %A - это брат B, если у них один родитель


Цитата
и ещё, как учесть, что может быть отношение брат, а может быть сестра..?
Ввести понятия "Мужчина" и "Женщина" и проверять на принадлежность к соответствующему полу...
18192123
Цитата(volvo @ 28.02.2009 20:38) *

Проверять на неравенство:
Код
brother(A,B):-parent(C,A),parent(C,B),A<>B. %A - это брат B, если у них один родитель



работаю в Amazi! Prolog IDE...и при добавлении проверки на неравенство появилась ошибка как раз на этой строке...
volvo
Ну, значит, ищи в хелпе, как в этом Прологе описывается неравенство... Можешь попробовать
Код
brother(A,B):-parent(C,A),parent(C,B),not(A=B).
. У меня нет ничего специфичного, обычный Турбо-Пролог понимает и тот и другой вариант.
18192123
Цитата(volvo @ 28.02.2009 21:17) *

Можешь попробовать
Код
brother(A,B):-parent(C,A),parent(C,B),not(A=B).
.

Спасибо! Получилось!
Теперь попыталась добавить понятия мужчина, женщина:
Код

parent(petr,olga).
parent(lidia,ivan).
parent(ivan,sergey).
parent(ivan,oleg).
parent(oleg,inna).
Man(petr).
Man(ivan).
Man(oleg).
Man(sergey).
Woman(lidia).
Woman(olga).
Woman(inna).
ancestor(A,B):-parent(A,B).
ancestor(A,B):-parent(C,B),ancestor(A,C).
brother(A,B):-parent(C,A),parent(C,B),not(A=B),Man(A).

Компилятору не понравились строчки с этими понятиями:
Код

Man(petr).
%....и т. д.

Скажите пожалуйста, так нельзя, как я пытаюсь сделать?
volvo
Почему же нельзя? Можно, тот же Турбо-Пролог нормально компилирует это. Но только тогда, когда в Predicates (не знаю, как это называется в твоем компиляторе, там, где пишутся прототипы всех функций) описаны прототипы Man и Woman
18192123
Цитата(volvo @ 28.02.2009 22:09) *

...нормально компилирует это. Но только тогда, когда в Predicates (не знаю, как это называется в твоем компиляторе, там, где пишутся прототипы всех функций) описаны прототипы Man и Woman

тоже не знаю, где у меня эти прототипы нужно описать..
ещё появился такой вариант:
Код

gander(petr,M).
gander(ivan,M).
gander(oleg,M).
gander(sergey,M).
gander(lidia,W).
gander(olga,W).
gander(inna,W).
parent(petr,ivan).
parent(petr,olga).
parent(lidia,ivan).
parent(ivan,sergey).
parent(ivan,oleg).
parent(oleg,inna).
ancestor(A,B):-parent(A,B).
ancestor(A,B):-parent(C,B),ancestor(A,C).
brother(A,B):-parent(C,A),parent(C,B),not(A=B),gander(A,M).

Проходит без ошибок, но никаких изменений в результатах...на запрос о братьях ivan выдает olga, хотя должно быть no...
Код

?- brother(X,ivan).

X = olga ,
no
?-
volvo
Цитата
на запрос о братьях ivan выдает olga
Правильно делает... Ибо надо проверять не пол A, а пол B, ведь на запрос "brother(olga, X)" ты ожидаешь, что именно Брат - мужчина, но никак не Ольга, правда?

Добавлено через 2 мин.
Брррр... У тебя все перепутано тут... brother(X, ivan) не означает, что надо перечислить всех братьев Ивана, а означает, что надо перечислить всех, кому Иван является братом... А это разные вещи... Делай запрос так: brother(ivan, X), и проверяй пол у второго параметра, а не у первого...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.