Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 10.09.2016
Сообщений: 4

В генеалог древе при построении его используя факты отец/2. мать/2. мужчина/1.повторяются решения

13.09.2016, 06:41. Показов 1173. Ответов 6

Студворк — интернет-сервис помощи студентам
Дали вот такое задание на прологе создать генеалогическое дерево обладая следующими фактами отец/2. мать/2. мужчина/1. Больше ничего не дано, сами вычисления различных родственников я написала, но возникает такая проблема при проверки на муж/жена он выводит ровно столько повторяющихся пар сколько в этой паре детей, эта ошибка копиться как снежный ком для связей типа тесть/теща и прочих. Есть предположение, что нужно что то где то резать при помощи !, но все попытки нужного результата не дали. Помогите.

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
mother("Kate","Anna").
mother("Kate","Jon").
father("Vlad","Anna").
father("Vlad","Jon").
 
mother("Anna","Viktor").
mother("Anna","Elena").
mother("Anna","Nady").
father("Bob","Viktor").
father("Bob","Elena").
father("Bob","Nady").
 
father("Bob","Tan").
father("Bob","Kirill").
mother("Sue","Tan").
mother("Sue","Kirill").
 
mother("Elena","Adam").
father("Karl","Adam").
 
mother("Alex","Sofa").
mother("Alex","Robert").
mother("Alex","Stas").
father("Jon","Sofa").
father("Jon","Robert").
father("Jon","Stas").
 
father("Robert","Svetl").
mother("Yula","Svetl").
father("Robert","Zahar").
mother("Yula","Zahar").
 
mother("Sofa","Serg").
mother("Sofa","Olga").
father("Dmitry","Serg").
father("Dmitry","Olga").
mother("Sofa","Mary").
father("Grig","Mary").
 
male("Vlad").
male("Jon").
male("Robert").
male("Viktor").
male("Bob").
male("Karl").
male("Adam").
male("Grig").
male("Zahar").
male("Stas").
male("Kirill").
male("Serg").
male("Dmitry").
 
sd(X,Y):-mother(Y,X);father(Y,X).
mg(X,Y):-mother(X,Z),father(Y,Z);mother(Y,Z),father(X,Z).
bs(X,Y):-mother(Z1,X),father(Z2,X),mother(Z1,Y),father(Z2,Y),X\=Y.
kz(X,Y):-sd(X,Z1),sd(Y,Z2),bs(Z1,Z2).
dt(X,Y):-sd(Y,Z),bs(X,Z).
plem(X,Y):-dt(Y,X).
vn(X,Y):-sd(X,Z),sd(Z,Y).
db(X,Y):-vn(Y,X).
pvn(X,Y):-vn(X,Z),sd(Z,Y).
pdb(X,Y):-pvn(Y,X).
tstth(X,Y):-male(Y),mg(Y,Z),sd(Z,X).
svsvkr(X,Y):-mg(Y,Z),sd(Z,X),not(male(Y)).
ztnev(X,Y):-mg(X,Z),sd(Z,Y).
shsvy(X,Y):-mg(Y,Z),not(male(Z)),bs(Z,X).
devzol(X,Y):-mg(Y,Z),male(Z),bs(X,Z).
mchotch(X,Y):-sd(Y,Z),mg(X,Z),not(sd(Y,X)).
padpas(X,Y):-mchotch(Y,X).
svbs(X,Y):-padpas(X,Z1),sd(Y,Z1),X\=Y.
edkrbs(X,Y):-mch(Z,X),mother(Z,Y),X\=Y.
edutrbs(X,Y):-otch(Z,X),father(Z,Y),X\=Y.
 
sun(X,Y):-sd(X,Y),male(X).
douter(X,Y):-sd(X,Y),not(male(X)).
wife(X,Y):-mg(X,Y),not(male(X)).
husband(X,Y):-mg(X,Y),male(X).
brat(X,Y):-bs(X,Y),male(X).
sister(X,Y):-bs(X,Y),not(male(X)).
 
dvsister(X,Y):-kz(X,Y),not(male(X)).
dvbrat(X,Y):-kz(X,Y),male(X).
dada(X,Y):-dt(X,Y),male(X).
tota(X,Y):-dt(X,Y),not(male(X)).
plemca(X,Y):-plem(X,Y),not(male(X)).
plemk(X,Y):-plem(X,Y),male(X).
 
vnck(X,Y):-vn(X,Y),not(male(X)).
vnk(X,Y):-vn(X,Y),male(X).
bab(X,Y):-db(X,Y),not(male(X)).
ded(X,Y):-db(X,Y),male(X).
pvnca(X,Y):-pvn(X,Y),not(male(X)).
pvnk(X,Y):-pvn(X,Y),male(X).
pbab(X,Y):-pdb(X,Y),not(male(X)).
pded(X,Y):-pdb(X,Y),male(X).
 
th(X,Y):-tstth(X,Y),not(male(X)).
tst(X,Y):-tstth(X,Y),male(X).
svkr(X,Y):-svsvkr(X,Y),not(male(X)).
sv(X,Y):-svsvkr(X,Y),male(X).
nev(X,Y):-ztnev(X,Y),not(male(X)).
zt(X,Y):-ztnev(X,Y),male(X).
svy(X,Y):-shsvy(X,Y),not(male(X)).
sh(X,Y):-shsvy(X,Y),male(X).
zol(X,Y):-devzol(X,Y),not(male(X)).
dev(X,Y):-devzol(X,Y),male(X).
 
mch(X,Y):-mchotch(X,Y),not(male(X)).
otch(X,Y):-mchotch(X,Y),male(X).
pad(X,Y):-padpas(X,Y),not(male(X)).
pas(X,Y):-padpas(X,Y),male(X).
svsis(X,Y):-svbs(X,Y),not(male(X)).
svbr(X,Y):-svbs(X,Y),male(X).
edkrsis(X,Y):-edkrbs(X,Y),not(male(X)).
edkrbr(X,Y):-edkrbs(X,Y),male(X).
edutrsis(X,Y):-edutrbs(X,Y),not(male(X)).
edutrbr(X,Y):-edutrbs(X,Y),male(X).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.09.2016, 06:41
Ответы с готовыми решениями:

Определены отношения Мужчина, Женщина, Родитель; определить Отец, Мать, Дедушка, Бабушка
В программе определены предикаты: мужчина(X); женщина(X); родитель(X,Y). Определить отношения отец(X,Y), мать(X,Y), дедушка(X,Y),...

Исправить ошибки при построении решения
Почему MS VS 2012 ultimate может выводить 20 ошибок компиляции при построении этого кода: #include "stdafx.h" #include...

Библиотека FLTK - ошибки при построении решения
Здравствуйте уважаемые, возникла следующая проблема: после того, как я подключил и присоединил библиотеку FLTK при попытке собрать решение...

6
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
13.09.2016, 09:58
Цитата Сообщение от Юневилия Посмотреть сообщение
Есть предположение, что нужно что то где то резать при помощи !, но все попытки нужного результата не дали
Так режьте! Где попытки?
Цитата Сообщение от Юневилия Посмотреть сообщение
Больше ничего не дано, сами вычисления различных родственников я написала, но возникает такая проблема при проверки на муж/жена он выводит ровно столько повторяющихся пар сколько в этой паре детей, эта ошибка копиться как снежный ком для связей типа тесть/теща и прочих.
Вычисления дают именно то, что в них написано. Практическое применение Пролога как раз и отличается от просто написания логических правил применением отсечения, дополнительных проверок и т.п.

Добавлено через 12 минут
Цитата Сообщение от Юневилия Посмотреть сообщение
Дали вот такое задание на прологе создать генеалогическое дерево обладая следующими фактами отец/2. мать/2. мужчина/1.
Этого вполне достаточно. Можно сразу написать обобщающее правило типа person(Name, Gender) или child_parent(Child, Parent), если это упростит понимание ситуации. Да много можно придумать, что сходу вроде бы излишне и неэффективно, но понятней при составлении правил от простого к сложному...
0
0 / 0 / 0
Регистрация: 10.09.2016
Сообщений: 4
13.09.2016, 10:37  [ТС]
arlat,
пробовала резать функцию муж жена так как ошибки именно с этого выражения пошли во все связанные с ними функции но увы это ничего не дало
а как бы вы это делали?
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
13.09.2016, 11:47
Цитата Сообщение от Юневилия Посмотреть сообщение
а как бы вы это делали?
Ну, это скорее зависит от того, чего хочет от вас преподаватель? Сразу видно, например, что данные не нормализованы, т.е. не важно это факты Пролога или записи в базе данных, но вывести однозначно всех людей не получится без исключения повторов.
Можно сначала нормализовать, например, созданием фактов person(Name, Gender). Здесь могут быть вопросы: какой диалект Пролога и какие встроенные предикаты можно использовать.

Например, если разрешено assert:
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
assert_person:-
    dynamic(person/2),
    ( mother(P,_), G=f
    ; father(P,_), G=m
    ; mother(_,P), male(P), G=m
    ; mother(_,P), not( male(P) ), G=f
    ),
    not( person(P, G) ),
    assertz( person(P, G) ),
    fail.
assert_person.
 
once_mg(X, Y) :-
  mg(X, Y),
  !.
Prolog
1
2
?- assert_person.
true.
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
?- person(X, f), person(Y, m), once_mg(X,Y).
X = "Kate",
Y = "Vlad" ;
X = "Anna",
Y = "Bob" ;
X = "Sue",
Y = "Bob" ;
X = "Elena",
Y = "Karl" ;
X = "Alex",
Y = "Jon" ;
X = "Yula",
Y = "Robert" ;
X = "Sofa",
Y = "Dmitry" ;
X = "Sofa",
Y = "Grig" ;
false.
Вариант, если разрешено использовать setof и once, но без assert:
Prolog
1
2
3
4
5
get_person(P, G) :-
    setof(X-G, Y^ (mother(X,Y),G=f ; father(X,Y), G=m), Ps1),
    setof(X-G,Y^ ( (mother(Y,X) ; father(Y,X)), (male(X) -> G=m ; G=f) ), Ps2),
    setof(X, (member(X,Ps1) ; member(X,Ps2)), Ps),
    member(P-G, Ps).
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
?- get_person(X, f), get_person(Y, m), once( mg(X, Y) ).
X = "Alex",
Y = "Jon" ;
X = "Anna",
Y = "Bob" ;
X = "Elena",
Y = "Karl" ;
X = "Kate",
Y = "Vlad" ;
X = "Sofa",
Y = "Dmitry" ;
X = "Sofa",
Y = "Grig" ;
X = "Sue",
Y = "Bob" ;
X = "Yula",
Y = "Robert" ;
false.
Добавлено через 15 минут
Погрешность конечно
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
assert_person:-
    dynamic(person/2),
    ( mother(P, _), G=f
    ; father(P, _), G=m
    ; mother(_, P), male(P), G=m
    ; mother(_, P), not( male(P) ), G=f
    ; father(_, P), male(P), G=m
    ; father(_, P), not( male(P) ), G=f
    ),
    not( person(P, G) ),
    assertz( person(P, G) ),
    fail.
assert_person.
если уж все варианты иметь ввиду
0
0 / 0 / 0
Регистрация: 10.09.2016
Сообщений: 4
13.09.2016, 12:43  [ТС]
arlat,
как я поняла задание, можно добавлять только исходные факты то есть мама папа и мужчин, остальное должно вычисляться при помощи правил

Добавлено через 2 минуты
и еще странность пролога в котором я работаю заключается в том что он вопрос позволяет задавать в таком виде mg(X,Y) нажимаю кнопку энтр если писать как у вас то есть с символом ?- то система ругается на ошибку синтексиса
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
13.09.2016, 15:20
Цитата Сообщение от Юневилия Посмотреть сообщение
?-
Это просто приглашение интерактивной среды, в вашем случае может и не быть. Я же спрашивал - какой Пролог то?

Цитата Сообщение от Юневилия Посмотреть сообщение
как я поняла задание
А вы уточните, это существенно. Дело в том, что все равно придется как-то поддерживать уникальный выбор, иначе к примеру такой вопрос как "кто у нас мама" mother(X, _) выдаст столько повторений, сколько детей. Как это решать, опять-таки, необходимо знать требования преподавателя.

Вот вариант с findall и sort (сортировка без повторов), что суть всё одно и то же, сначала добиться уникальности person.
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
get_person2(P, G):-
    findall([P, G],
        ( mother(P, _), G=f
        ; father(P, _), G=m
        ; mother(_, P), male(P), G=m
        ; mother(_, P), not( male(P) ), G=f
        ; father(_, P), male(P), G=m
        ; father(_, P), not( male(P) ), G=f
        ),
    Ps0 ),
    sort(Ps0, Ps),
    member([P, G], Ps).
или с использованием setof, всё то же самое
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
get_person3(P, G):-
    setof([P, G],
        X^
        ( mother(P, X), G=f
        ; father(P, X), G=m
        ; mother(X, P), male(P), G=m
        ; mother(X, P), not( male(P) ), G=f
        ; father(X, P), male(P), G=m
        ; father(X, P), not( male(P) ), G=f
        ),
    Ps ),
    member([P, G], Ps).
но всё равно нужен once или аналог с применением отсечения
Prolog
1
get_person3(P1, f), get_person3(P2, m), once( wife(P1,P2) ).
Короче, больше рассуждений по реализации задачи, а то так долго можно страдать

Собственно, можно изменить wife
Prolog
1
wife(X,Y):-mg(X,Y),not(male(X)),!.
но это именно в случаете предварительного выбора person
Prolog
1
get_person3(P1, f), get_person3(P2, m), wife(P1,P2).
Звучит: если существуют такие женщина и мужчина, что женщина является женой мужчины, то это супруги

Цитата Сообщение от Юневилия Посмотреть сообщение
а как бы вы это делали?
сначала assert_person, просто и эффективно, к тому же использование findall, sort и setof это уже немного в другую сторону обучения
0
0 / 0 / 0
Регистрация: 10.09.2016
Сообщений: 4
13.09.2016, 17:59  [ТС]
arlat,
огромное спасибо за Ваш ответ теперь стало яснее в какую сторону в случае чего бежать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.09.2016, 17:59
Помогаю со студенческими работами здесь

Как отменить автосохранение при построении решения в VS 2013
Добрый день! Подскажите, как можно оменить автосохранение проекта (решения) при построении (запуске) в VS 2013 Community. Или как...

Написать запрос, возвращающий пары отец-мать, где для одного из родителей не заполнено или не совпадает поле ИД супруга с другим родителем
Помогите с задачей: Описание. Вся модель состоит из одной таблицы Личность. В таблице Личность содержится ФИО некоторого человека и...

Узнать ширину элемента при его построении
Допустим есть некий код: foreach (string s in etaps) { Rectangle etapsRect = new Rectangle(); etapsRect.Fill =...

Совет Европы хочет упразднить слова "мать" и "отец"
Совет Европы рекомендует всем своим 47 членам отказаться в официальном обращении от употребления слов "отец" и "мать",...

Добавить функцию поиска элемента по значению в древе и удаление его с последующим сдвигом древа
У меня есть такая реализаця древа ,мне надо обернуть весь функционал в один класс и добавить функцую, которая будет принимать введенное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru