1 / 1 / 0
Регистрация: 04.12.2011
Сообщений: 190
1

Задачка про Гномов и Злого волшебника Грендальфа

19.06.2014, 05:00. Показов 2150. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Задали такую головоломку решить на Прологе:
ЗАДАЧА №10.
Пользуясь методом «образовать и проверить», напишите PROLOG-программу для решения следующей головоломки:

На рудниках злого волшебника Грендальфа уже много лет трудятся пять гномов. По приказу чародея каждый из них ищет камни строго определённого вида. Грендальф хранит в своей канцелярии два списка узников: список имён, в котором имена гномов расположены по алфавиту, и список сроков, упорядоченный по возрастанию сроков заключения, среди которых есть 80,159,176 и 202 года.
Известно, что:
1. Гном с кайлом стоит в списке сроков сразу после искателя сапфиров.
2. Брыкли в списке сроков следует сразу за гномом с турбобуром. Однако Брыкли
придётся работать всё же не так долго, как специалисту по изумрудам.
3. Искателю изумрудов придётся томиться в подземелье дольше, чем Фигли, но и тот
трудится уже больше 80 лет.
4. Звякли никогда не имел дела с сапфирами. В списке сроков он стоит прямо перед
искателем агатов.
5. Квакли в списке сроков следует сразу за гномом с киркой и прямо перед гномом с
отбойным молотком, ищущим алмазы.
6. Имя гнома, специализирующегося на алмазах, стоит в списке имён сразу после
имени бедняги, который заключён на 131 год.
Нужно ответить на вопросы:
1. Кто ищет рубины?
2. Кто работает заступом?
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
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
domains
    shname=string
    stone=string
    tools=string
    srok=integer
    gnome=gnome(shname, srok, stone, tools)
    gnomelist=gnome*
    
predicates
    puzzle % головоломка
    structure(gnomelist) % структура
    key(gnomelist) % ключ
    solution(gnomelist) % решение
    shname(gnome, shname) % имя
    srok(gnome, srok) % срок
    tools(gnome, tools) % инсрумент
    stone(gnome, stone) % ищет камни
    nostone(gnome, stone) % не ищет камни
    %older(gnome) % старше
    member(gnome, gnomelist) % принадлежит списку
    
goal
    puzzle.     
    
clauses
    % инициализация структуры:
    structure([
        gnome("Brikli",_,_,_),
        gnome("Drihli",_,_,_),
        gnome("Zvakli",_,_,_),
        gnome("Kvakli",_,_,_),
        gnome("Figli",_,_,_)
    ]).
    
    
puzzle:- structure(Struct),
    key(Struct),
    solution(Struct).
    
    
key(Gnom):-
 
 
                            % объявление камней:
    member(gnome(_,_,"Almaz",_),Gnom),
    member(gnome(_,_,"Rubin",_),Gnom),
    member(gnome(_,_,"Sapfir",_),Gnom),
    member(gnome(_,_,"Agat",_),Gnom),
    member(gnome(_,_,"Izumrud",_),Gnom),
                            % объявление инструментов:
    member(gnome(_,_,_,"Kailo"),Gnom),                      
    member(gnome(_,_,_,"Turbobur"),Gnom),
    member(gnome(_,_,_,"Kirka"),Gnom),
    member(gnome(_,_,_,"Molot"),Gnom),
    member(gnom(_,_,_,"Zastup"),Gnom),
    
                            % объявление строков:
    %member(gnome(_,80,_,_),Gnom),                      
    %member(gnome(_,131,_,_),Gnom),
    %member(gnome(_,159,_,_),Gnom),
    %member(gnome(_,176,_,_),Gnom),
    %member(gnome(_,202,_,_),Gnom),
    
                            % ключ 1:
%   Гном с кайлом стоит в списке сроков сразу после искателя сапфиров.
 
    member(Gn1,Gnom),
    tools(Gn1,"Kailo"),
                            % ключ 2:
%   Брыкли в списке сроков следует сразу за гномом с турбобуром. Однако Брыкли      
%      придётся работать всё же не так долго, как специалисту по изумрудам.
    member(Gn2,Gnom),
    shname(Gn2,"Brikli"),   
                            % ключ 3:
%   Искателю изумрудов придётся томиться в подземелье дольше, чем Фигли, но и тот  
%      трудится уже больше 80 лет.
    member(Gn3,Gnom),
    member(Gn4,Gnom),
    shname(Gn4,"Figli"),    
    stone(Gn3,"Izumrud"),
                            % ключ 4:
%   Звякли никогда не имел дела с сапфирами. В списке сроков он стоит прямо перед 
%     искателем агатов.
    member(Gn5,Gnom),   
    shname(Gn5,"Zvakli"),   
    nostone(Gn5,"Sapfir"),
                            % ключ 5:
%   Квакли в списке сроков следует сразу за гномом с киркой и прямо перед гномом с 
%      отбойным молотком, ищущим алмазы.
    member(Gn6,Gnom),
    member(Gn7,Gnom),
    member(Gn8,Gnom),
    shname(Gn6,"Kvakli"),
    tools(Gn7,"Kirka"),
    tools(Gn8,"Molot"), 
    stone(Gn8,"Almaz"),
                            % ключ 6:
%   Имя гнома, специализирующегося на алмазах, стоит в списке имён сразу после 
%      имени бедняги, который заключён на 131 год.
    member(Gn9,Gnom),                   
    stone(Gn9,"Almaz").
                            % вывод результата (структуры):
solution(Gnom):- write(Gnom).
 
    stone(stone(_,_,A,_),A).
    tools(tools(_,_,_,B),B).
    srok(gnome(_,C,_,_),C).
Проблемы:
1) Выдает ошибку 401 No clauses for this predicate для такой строки: shname(gnome, shname) % имя. В чем может быть проблема?
2) Что нужно еще добавить: чтобы описать, что такой-то гном стоит в таком-то списке перед кем-то или после?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2014, 05:00
Ответы с готовыми решениями:

Задача про гномов
Помогите пожалуйста разобраться с задачей-> На скамье длиной L см расположены N гномов. В...

Тема про гномов, эльфов и орков. Ролевики и толкиенисты, кучкуемся!
Девять - струны звонкой лютни, той, что носят менестрели, что воспели в своих песнях девять...

Задачка про массивы
Только начала изучать программирование, пытаюсь разбиратся ,но не всё так просто , помогите пжлст ...

Задачка про экзамен
Экзамен состоит с 10 вопросов, на каждый с которых нужно дать ответ "Да" либо "нет". Какая...

6
Модератор
Эксперт функциональных языков программированияЭксперт Python
37038 / 20492 / 4244
Регистрация: 12.02.2012
Сообщений: 33,853
Записей в блоге: 13
19.06.2014, 14:11 2
Мне кажется, что имя предиката не должно совпадать с именем домена
0
1 / 1 / 0
Регистрация: 04.12.2011
Сообщений: 190
19.06.2014, 15:40  [ТС] 3
Пробовал чтоб разные имена были. Все таже ошибка. А имеет значение в какой последовательности предикаты писать?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37038 / 20492 / 4244
Регистрация: 12.02.2012
Сообщений: 33,853
Записей в блоге: 13
19.06.2014, 16:45 4
Цитата Сообщение от Nikoli4 Посмотреть сообщение
А имеет значение
- имеет.
0
1 / 1 / 0
Регистрация: 04.12.2011
Сообщений: 190
19.06.2014, 17:22  [ТС] 5
В каком бы порядке не ставил, одно и тоже.
0
Фрилансер
3707 / 2079 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
23.06.2014, 20:47 6
Цитата Сообщение от Nikoli4 Посмотреть сообщение
Выдает ошибку 401 No clauses for this predicate для такой строки: shname(gnome, shname) % имя. В чем может быть проблема?
Проблема дословно описана в сообщении: нет правил для предиката shname.
То есть предикат shname описан в разделе predicates, но правил для него нет в разделе clauses.

Вероятно, предполагалось наличие правила типа
Prolog
1
shname(gnome(S, _, _, _), S).
Добавлено через 6 минут
Цитата Сообщение от Nikoli4 Посмотреть сообщение
Что нужно еще добавить: чтобы описать, что такой-то гном стоит в таком-то списке перед кем-то или после?
Добавьте в структуру gnome поле для номера. Номера задайте при инициализации списка, а имена введите дополнительно пр помощи member.
0
1 / 1 / 0
Регистрация: 04.12.2011
Сообщений: 190
24.06.2014, 04:27  [ТС] 7
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
domains 
    tname=string
    ttool=string
    tsrok=integer
    tston=string
    tsroki=tsroki(tname, tsrok, tston, ttool)
    tsrokilist=tsroki*
    
predicates
    puzzle
    structure(tsrokilist)
    key(tsrokilist)
    question(tsrokilist, tname, tsrok)
    solution(tname, tsrok)
    
    tgname(tsroki,tname)
    tgtool(tsroki,ttool)
    tgston(tsroki,tston)
    tgsrok(tsroki,tsrok)
    
    stateafter(tsroki, tsroki, tsrokilist)
    
    member(tsroki,tsrokilist)
    
goal
    puzzle.
    
clauses
    puzzle:-
        structure(Struct),
        key(Struct),
        question(Struct, Name, Srok),
        solution(Name, Srok).
        
    %structure(
    %[tsroki(_,80,_,_),
    %tsroki(_,131,_,_),
    %tsroki(_,159,_,_),
    %tsroki(_,176,_,_),
    %tsroki(_,202,_,_)]
    %).
    structure(
    [tsroki(_,_,_,_),
    tsroki(_,_,_,_),
    tsroki(_,_,_,_),
    tsroki(_,_,_,_),
    tsroki(_,_,_,_)]
    ).
    %structure1([
    %tsroki(_,80),
    %tsroki(_,131),
    %tsroki(_,159),
    %tsroki(_,176),
    %tsroki(_,202)
    %]).
    
key(Sroki):-
%key(Gnoms):-
    
    % объявление камней:
    member(tsroki(_,80,_,_),Sroki),
    member(tsroki(_,131,_,_),Sroki),
    member(tsroki(_,159,_,_),Sroki),
    member(tsroki(_,176,_,_),Sroki),
    member(tsroki(_,202,_,_),Sroki),
    
        % объявление камней:
    %member(tsroki(_,_,"Almaz",_),Sroki),
    %member(tsroki(_,_,"Rubin",_),Sroki),
    %member(tsroki(_,_,"Sapfir",_),Sroki),
    %member(tsroki(_,_,"Agat",_),Sroki),
    %member(tsroki(_,_,"Izumrud",_),Sroki),
        % объявление инструментов:
    %member(tsroki(_,_,_,"Kailo"),Sroki),                       
    %member(tsroki(_,_,_,"Turbobur"),Sroki),
    %member(tsroki(_,_,_,"Kirka"),Sroki),
    %member(tsroki(_,_,_,"Molot"),Sroki),
    %member(tsroki(_,_,_,"Zastup"),Sroki),
    
 
%       ключ 1:
%   Гном с кайлом стоит в списке сроков сразу после искателя сапфиров.
    stateafter(Gn2, Gn1, Sroki),
    tgtool(Gn1,"Kailo"),
    tgston(Gn2,"Sapfir"),
    
    
%       ключ 2:
%   Брыкли в списке сроков следует сразу за гномом с турбобуром. Однако Брыкли      
%   придётся работать всё же не так долго, как специалисту по изумрудам.
    stateafter(Gn4, Gn3, Sroki),
    stateafter(Gn3, Gn5, Sroki),
    tgname(Gn3,"Brikli"),
    tgtool(Gn4,"Turbobur"),
    tgston(Gn5,"Izumrud"),
    
    
%       ключ 3:
%   Искателю изумрудов придётся томиться в подземелье дольше, чем Фигли, но и тот  
%   трудится уже больше 80 лет.
    stateafter(Gn7, Gn6, Sroki),
    stateafter(Gn8, Gn7, Sroki),
    tgston(Gn6,"Izumrud"),
    tgname(Gn7,"Figli"),
    tgsrok(Gn8,80),
    
%       ключ 4:
%   Звякли никогда не имел дела с сапфирами. В списке сроков он стоит прямо перед 
%   искателем агатов.
    stateafter(Gn9, Gn10, Sroki),
    tgname(Gn9,"Zvakli"),
    not(tgston(Gn9,"Sapfir")),
    tgston(Gn10,"Agat"),
%        ключ 5:
%   Квакли в списке сроков следует сразу за гномом с киркой и прямо перед гномом с 
%   отбойным молотком, ищущим алмазы.
    stateafter(Gn12, Gn11, Sroki),
    stateafter(Gn11, Gn13, Sroki),
    tgname(Gn11,"Kvakli"),
    tgtool(Gn12,"Kirka"),
    tgtool(Gn13,"Molot"),
    tgston(Gn13,"Almaz"),
    
%   ключ 6:
%   Имя гнома, специализирующегося на алмазах, стоит в списке имён сразу после 
%   имени бедняги, который заключён на 131 год.
    stateafter(Gn15, Gn14, Sroki),
    tgston(Gn14,"Almaz"),
    tgsrok(Gn15,131).
 
    question(Sroki, Name, Srok):-
                %Вопрос 1 
                member(G1,Sroki),
                tgname(G1,Name),
                tgston(G1,"Rubin"),
                %Вопрос 2
                member(G2,Sroki),
                tgname(G2,Name),
                tgtool(G2,"Zastup"),
                %Вопрос 3
                member(G3,Sroki),
                tgsrok(G3,Srok),
                tgname(G3,"Drihli").
    solution(Name, Srok):- 
                        write("Rubin ishet Gnom"), write(Name), nl,
                        write("Zastupom rabotaet Gnom"), write(Name), nl,
                        write("Srok y Drihli"), write(Srok).
    
    stateafter(A,B,[A,B,C]).
    stateafter(A,C,[A,B,C]).
    stateafter(B,C,[A,B,C]).    
    tgname(tsroki(A,B,C,D),A).  %Имя
    tgsrok(tsroki(A,B,C,D),B).  %Срок
    tgston(tsroki(A,B,C,D),C).  %Камни
    tgtool(tsroki(A,B,C,D),D).  %Инструменты
    
    
    member(X,[X|Y]).
    member(X,[_|Y]):-member(X,Y).
На данный момент пришел к такому коду.

При запуске выводит 2 варнинга:
The variable is only used once здесь:
stateafter(A,B,[A,B,C]).
stateafter(A,C,[A,B,C]).
stateafter(B,C,[A,B,C]).
tgname(tsroki(A,B,C,D),A). %Имя
tgsrok(tsroki(A,B,C,D),B). %Срок
tgston(tsroki(A,B,C,D),C). %Камни
tgtool(tsroki(A,B,C,D),D). %Инструменты

The variable is not bound in this clause здесь:
structure(
[tsroki(_,_,_,_),
tsroki(_,_,_,_),
tsroki(_,_,_,_),
tsroki(_,_,_,_),
tsroki(_,_,_,_)]
). , а конкретно только в самом начале [tsroki(_,_,_,_),
В диалоговое окно ничего не выводит, даже write("Rubin ishet Gnom"), write("Zastupom rabotaet Gnom"), write("Srok y Drihli"),

Здесь stateafter(Gn12, Gn11, Sroki), я указываю что такой то гном с (Именем или камнем или инструментом) стоит после/перед такого то гнома с (Именем или камнем или инструментом).

Подскажите пожалуйста что, где не так?

Добавлено через 4 минуты
И еще вопрос на счет вот этой части кода:
% ключ 1:
% Гном с кайлом стоит в списке сроков сразу после искателя сапфиров.
stateafter(Gn2, Gn1, Sroki),
tgtool(Gn1,"Kailo"),
tgston(Gn2,"Sapfir"),


% ключ 2:
% Брыкли в списке сроков следует сразу за гномом с турбобуром. Однако Брыкли
% придётся работать всё же не так долго, как специалисту по изумрудам.
stateafter(Gn4, Gn3, Sroki),
stateafter(Gn3, Gn5, Sroki),
tgname(Gn3,"Brikli"),
tgtool(Gn4,"Turbobur"),
tgston(Gn5,"Izumrud"),


% ключ 3:
% Искателю изумрудов придётся томиться в подземелье дольше, чем Фигли, но и тот
% трудится уже больше 80 лет.
stateafter(Gn7, Gn6, Sroki),
stateafter(Gn8, Gn7, Sroki),
tgston(Gn6,"Izumrud"),
tgname(Gn7,"Figli"),
tgsrok(Gn8,80),

% ключ 4:
% Звякли никогда не имел дела с сапфирами. В списке сроков он стоит прямо перед
% искателем агатов.
stateafter(Gn9, Gn10, Sroki),
tgname(Gn9,"Zvakli"),
not(tgston(Gn9,"Sapfir")),
tgston(Gn10,"Agat"),
% ключ 5:
% Квакли в списке сроков следует сразу за гномом с киркой и прямо перед гномом с
% отбойным молотком, ищущим алмазы.
stateafter(Gn12, Gn11, Sroki),
stateafter(Gn11, Gn13, Sroki),
tgname(Gn11,"Kvakli"),
tgtool(Gn12,"Kirka"),
tgtool(Gn13,"Molot"),
tgston(Gn13,"Almaz"),

% ключ 6:
% Имя гнома, специализирующегося на алмазах, стоит в списке имён сразу после
% имени бедняги, который заключён на 131 год.
stateafter(Gn15, Gn14, Sroki),
tgston(Gn14,"Almaz"),
tgsrok(Gn15,131).

Так как каждый гном может использовать только 1 инструмент, и добывать только 1 вид камня. Правильно ли вот это: tgston(Gn14,"Almaz"), tgston(Gn13,"Almaz")?
0
24.06.2014, 04:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2014, 04:27
Помогаю со студенческими работами здесь

Задачка про цех
На склад из цеха в течении 3-х смен поступают готовые изделия из 8-ми наименований, а затем...

Задачка про каналы
В районе города не работает компьютерная сеть. Известно количество узлов сети. Протестировав...

Задачка про руны
Руны — это древние магические знаки, которые наши предки использовали как буквы. Говорят, что...

задачка про матрицу.
ПОмогите пожалуйста сделать задачку... я совсем не шарю, а допуск нужен..... Для матрицы из 3...


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

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

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