psixoz
1

Кто кого нарисовал?

03.12.2010, 16:58. Показов 2566. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите с задачкой: 4 девочки: Надя, Вера, Галя, Люба нарисовали по 1 животному. Получились 2 лошади, 1 овца и 1 корова. Кого нарисовала каждая девочка, если Надя и Вера не рисовали овцу; Галя не рисовала корову; Люба не рисовала лошадь; Вера и Галя, Галя и Люба, Надя и Люба нарисоваля разных животных?

Смог додуматься про первую часть правила:

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
predicates
    sootv(Symbol,Symbol).
    name(Symbol).
    animal(Symbol).
clauses
    name(nadya).
    name(vera).
    name(galya).
    name(lyuba).
    animal(sheep).
    animal(cow).
    animal(horse).
    sootv(X,Y):-name(X),animal(Y),X=nadya,not(Y=sheep).
    sootv(X,Y):-name(X),animal(Y),X=vera,not(Y=sheep).
    sootv(X,Y):-name(X),animal(Y),X=galya,not(Y=cow).
    sootv(X,Y):-name(X),animal(Y),X=lyuba,not(Y=horse).
goal
    sootv(X,Y),write(X," paint ",Y),nl,fail.
Как еще дописать условие про разных животных?
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2010, 16:58
Ответы с готовыми решениями:

Определите, кто является поэтом, кто композитором, кто художником и у кого есть борода
Андреев, Борисов и Николаев – поэт, композитор и художник. У поэта нет бороды, и он зарабатывает...

Кто из актёров кого играет
В одном театре работают четыре актёра: Смирнов, Снегов, Морев и Никитин. Один из них играет роль...

Логическая задача (кто кого выгуливает)
Помогите пожалуйста с задачей: Трое ребят вышли гулять с собакой, кошкой и хомячком. Известно, что...

Кто для кого?
Вот меня пребило. Вот в чем вопрос. Сложилась такая ситуация, когда создатели сайтов вынуждены их...

5
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 17
25.11.2013, 11:46 2
Четыре девочки: Надя, Вера, Галя и Люба, нарисовали по одному животному.
Получились две лошади, одна овца и одна корова. Что нарисовала каждая девочка, если:
– Надя и Вера не рисовали овцу;
– Галя не рисовала корову;
– Люба не рисовала лошадь;
– Вера и Галя, Галя и Люба, Надя и Люба нарисовали разных животных.

На логическом уровне расклады таковы:
Вариант 1 Надя-Лошадь,Вера-Корова,Галя-Лошадь,Люба-Овца
Вариант 2 Надя-Лошадь,Вера-Лошадь,Галя-Овца,Люба-Корова

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
Domains
 
st=string
 
Predicates
 
ne_ris(st,st)
ne_kk(st,st)
ris(st,st)
ris_z(st)
 
Clauses
 
ne_ris("Nad","Ovca").
ne_ris("Ver","Ovca").
ne_ris("Gal","Koro").
ne_ris("Lub","Losh").
 
ne_kk("Nad","Lub").
ne_kk("Ver","Gal").
ne_kk("Gal","Lub").
ne_kk("Gal","Ver").
ne_kk("Lub","Gal").
ne_kk("Lub","Nad").
 
ris(X,"Ovca"):-ne_ris(X,M),"Ovca"<>M.
ris(X,"Koro"):-ne_ris(X,M),"Koro"<>M.
ris(X,"Losh"):-ne_ris(X,M),"Losh"<>M.
 
ris_z(X):-ne_kk(X,Y),ris(X,N),ris(Y,M),N<>M,write(N),fail.
ris_z(_): -!.
Написал такой вот код. Сказали неправильно. Нужно чтобы выводило вариант сразу для всех четырех а не перебирало возможные варианты по отдельности. Как реализовать?
0
99 / 99 / 14
Регистрация: 07.02.2013
Сообщений: 128
25.11.2013, 14:41 3
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
Domains
st=string
slist=st*
 
Predicates
nondeterm girl(st)
nondeterm picture(st)
nondeterm girl_picture(st,st) %кто кого не рисовал
nondeterm result(st,st,st,st,st,st,st,st)
nondeterm count(slist,integer,integer,integer) %Число нарисованных животных
 
Clauses
girl("Надя").girl("Вера").girl("Галя").girl("Люба").
picture("Овца").picture("Корова").picture("Лошадь"). 
 
count([H|T],N1,N2,N3):-H="Лошадь",count(T,N11,N2,N3),N1=N11+1.
count([H|T],N1,N2,N3):-H="Овца",count(T,N1,N21,N3),N2=N21+1.
count([H|T],N1,N2,N3):-H="Корова",count(T,N1,N2,N31),N3=N31+1.
count([],0,0,0).
 
girl_picture(X,Y):-picture(Y),girl(X),X="Надя",Y<>"Овца";picture(Y),girl(X),X="Вера",Y<>"Овца".
girl_picture(X,Y):-picture(Y),girl(X),X="Галя",Y<>"Корова".
girl_picture(X,Y):-picture(Y),girl(X),X="Люба",Y<>"Лошадь".
 
result(X1,Y1,X2,Y2,X3,Y3,X4,Y4):- 
  girl_picture(X1,Y1),girl_picture(X2,Y2),girl_picture(X3,Y3),girl_picture(X4,Y4),
  X1="Надя",X2="Вера",X3="Галя",X4="Люба", 
  Y2<>Y3,Y3<>Y4,Y1<>Y4,
  count([Y1,Y2,Y3,Y4],2,1,1).
 
goal
  result(X1,Y1,X2,Y2,X3,Y3,X4,Y4).
1
787 / 591 / 156
Регистрация: 07.10.2013
Сообщений: 1,315
25.11.2013, 15:34 4
Цитата Сообщение от ВикторБаранович Посмотреть сообщение
Четыре девочки: Надя, Вера, Галя и Люба, нарисовали по одному животному.
Получились две лошади, одна овца и одна корова. Что нарисовала каждая девочка, если:
– Надя и Вера не рисовали овцу;
– Галя не рисовала корову;
– Люба не рисовала лошадь;
– Вера и Галя, Галя и Люба, Надя и Люба нарисовали разных животных.

На логическом уровне расклады таковы:
Вариант 1 Надя-Лошадь,Вера-Корова,Галя-Лошадь,Люба-Овца
Вариант 2 Надя-Лошадь,Вера-Лошадь,Галя-Овца,Люба-Корова
SWI-Prolog, для VIP подправьте и/или доработайте сами.
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
girls(['Nad', 'Ver', 'Gal', 'Lub']).
 
pets(['Losh', 'Losh', 'Ovca', 'Koro']).
 
pics(Pics) :-
    girls(Girls),
    pets(Pets),
    pics(Girls, Pets, Pics),
    rule_diff_pic([['Ver', 'Gal'], ['Gal', 'Lub'], ['Nad', 'Lub']], Pics).
pics([], _, []).
pics([Girl|Girls], Pets, [[Girl, Pet]|Pics]) :-
    select(Pet, Pets, Pets1),
    rule_no_pic(Girl, Pet),
    pics(Girls, Pets1, Pics).
    
rule_no_pic(Girl, Pet) :-
    member(Girl, ['Nad', 'Ver']),
    not(Pet = 'Ovca').
rule_no_pic('Gal', Pet) :-
    not(Pet = 'Koro').
rule_no_pic('Lub', Pet) :-
    not(Pet = 'Losh').
 
rule_diff_pic([], _).
rule_diff_pic([[Girl1, Girl2]|Pairs], Pics) :-
    member([Girl1, Pet1], Pics),
    member([Girl2, Pet2], Pics),
    not(Pet1 = Pet2),
    rule_diff_pic(Pairs, Pics).
?- setof(Pics, pics(Pics), Set).
Set = [[['Nad', 'Losh'], ['Ver', 'Koro'], ['Gal', 'Losh'], ['Lub', 'Ovca']], [['Nad', 'Losh'], ['Ver', 'Losh'], ['Gal', 'Ovca'], ['Lub', 'Koro']]].
1
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 17
25.11.2013, 20:54 5
А если это нужно осуществить основываясь на базовых понятиях, когда еще не известна работа с списками? Как бы пользуясь только умениями с л/р 1 СТРУКТУРА ПРОГРАММЫ НА ПРОЛОГЕ. И используя Турбо-пролог?
0
787 / 591 / 156
Регистрация: 07.10.2013
Сообщений: 1,315
26.11.2013, 11:16 6
Цитата Сообщение от ВикторБаранович Посмотреть сообщение
А если это нужно осуществить основываясь на базовых понятиях, когда еще не известна работа с списками? Как бы пользуясь только умениями с л/р 1 СТРУКТУРА ПРОГРАММЫ НА ПРОЛОГЕ. И используя Турбо-пролог?
Структуры, списки, сопоставление и рекурсия - это и есть базовые понятия! Там ещё до кучи этих базовых понятий раз-два и обчёлся.
По другому, л/р спихиваются преподу через магазин
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2013, 11:16
Помогаю со студенческими работами здесь

Google - Yandex кто кого ?
1 января Гооги открывает свое представительство в Москве. B-)

Кто от кого получил подарок?
Здравствуйте. Помогите решить такую вот интересную задачку(заранее спасибо): Петя сам решил...

Кто кого поддержит на выборах?
Я-ПРОТИВ ВСЕХ:p

Как определить кто у кого спер контент?
Достался сайт. Половина страниц не уникальна по копискейпу (на каждую 2-3 точных копии). Некоторые...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru