Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 8
1

Логическая задача: определить, кто выиграл этап гонки "Формула 1"

22.04.2016, 16:33. Показов 2618. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
болельщики автогонок "Формула-1", спорили о результатах
предстоящего этапа гонок.
— Вот увидишь, Шумахер не придет первым, — сказал Дима. Первым будет Хилл.
— Да нет же, победителем будет, как всегда, Шумахер, — воскликнул Никита. — А об
Алези и говорить нечего, ему не быть первым.
Паша, к которому обратился Никита, возмутился:
— Хиллу не видать первого места, а вот Алези пилотирует самую мощную машину.
По завершении этапа гонок оказалось, что каждое из двух предположений двоих
друзей подтвердилось, а оба предположения третьего из друзей оказались неверны.
Кто выиграл этап гонки?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2016, 16:33
Ответы с готовыми решениями:

Определить, кто выиграл этап гонки "Формула 1"
Привет, помогите пожалуйста. Нам дали задание в прологе, который мы в глаза не видели, но это как...

Кто выиграл этап гонки?
Нужно решить способом логического сложения и умножения Вот увидишь, Крош и Ежик не придут первыми,...

Логическая задача (худоджник, математик, писатель и музыкант; определить кто есть кто)
Помогите найти косяк. В доме живут Воронов, Павлов, Журавлев и Синицын. Один из них художник,...

Логическая задача: определить, кто какие предметы преподает
Помогите, пожалуйста. Необходимо написать программу для решения следующей логической задачи: В...

Логическая задача: определить, кто какую должность занимает
Помогите решить задачку: Левин, Митерев и Набатов работают в банке в качестве бухгалтера,...

5
0 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 8
25.04.2016, 15:49  [ТС] 2
Ребят, подскажите пожалуйста, логическое программирование вообще не поддается моему уму..
0
794 / 598 / 156
Регистрация: 07.10.2013
Сообщений: 1,327
26.04.2016, 11:58 3
Лучший ответ Сообщение было отмечено fred03 как решение

Решение

Цитата Сообщение от fred03 Посмотреть сообщение
логическое программирование вообще не поддается моему уму
Тут, в первую очередь, математическая логика. Распишите решение словами, а там посмотрим, как переложить на Пролог. Можно посмотреть и попытаться написать по аналогии Кто разбил стекло? Вместо разбил стекло исследовать выигрыш в гонке.

Здесь наверняка ошибка в постановке задачи, скорей всего трудности перевода...
"каждое из двух предположений двоих друзей подтвердилось, а оба предположения третьего из друзей оказались неверны": кто-то, как минимум, должен назвать победителя правильно, и, как минимум, у одного другого это должно подтвердиться обоими предположениями ("каждое из двух"), - уже не проходит, - что там говорить про третьего.

Примерно, по аналогии с разбитым окном.
Есть излишки и нет решения, но для затравки соответствия "текст задачи - код" подойдёт.
Кликните здесь для просмотра всего текста
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
% — Вот увидишь, Шумахер не придет первым, — сказал Дима.
approve(dima, shum, no).
% Первым будет Хилл.
approve(dima, hill, yes).
% — Да нет же, победителем будет, как всегда, Шумахер, — воскликнул Никита.
approve(nik, shum, yes).
% — А об Алези и говорить нечего, ему не быть первым.
approve(nik, alesi, no).
% Паша, к которому обратился Никита, возмутился:
% — Хиллу не видать первого места,
approve(pasha, hill, no).
% а вот Алези пилотирует самую мощную машину.
approve(pasha, alesi, yes).
 
% По завершении этапа гонок оказалось, что каждое из двух предположений двоих
% друзей подтвердилось, а оба предположения третьего из друзей оказались неверны.
% Кто выиграл этап гонки?
win_race1(Win) :-
  % если один из болельщиков назвал пилота-победителя правильно
  approve(Fan1, Win, yes),
  % и не назвал иначе
  \+ approve(Fan1, Win, no),
  % то другой
  approve(Fan2, _, _),
  % угадал так же,
  approve(Fan2, Win, yes),
  % и, не говорил, что этот пилот не победит
  \+ approve(Fan2, Win, no),
  % а третий
  approve(Fan3, _, _),
  % утверждал, что выигравший пилот не будет победителем,
  approve(Fan3, Win, no),
  % и также не утверждал, что будет
  \+ approve(Fan3, Win, yes),
  % рассуждения вели разные болельщики
  is_distinct([Fan1, Fan2, Fan3]).
 
% все элементы списка разные
is_distinct([]).
is_distinct([H | T]) :-
  \+ member1(H, T),
  !,
  is_distinct(T).
 
% принадлежность
member1(X,[X|_]).
member1(X,[_|T]):-
    member1(X,T).

Возможен вариант через перестановку вместо проверки уникальности, но это уже можно обсудить после уточнения правильности постановки задачи.
1
0 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 8
27.04.2016, 16:20  [ТС] 4
arlat,Спасибо, вот решение данной логической задачи.
Введем обозначения для логических высказываний:

• Ш — победит Шумахер; Х — победит Хилл; А — победит Алези.

• Реплика Ника "Алези пилотирует самую мощную машину" не содержит никакого утверждения о месте, которое займёт этот гонщик, поэтому в дальнейших рассуждениях не учитывается.

• Учитывая то, что предположения двух друзей подтвердились, а предположения третьего неверны, запишем и упростим истинное высказывание

• Высказывание истинно только при Ш=1, А=0, Х=0.

Победителем этапа гонок стал Шумахер.
0
794 / 598 / 156
Регистрация: 07.10.2013
Сообщений: 1,327
28.04.2016, 10:51 5
Цитата Сообщение от fred03 Посмотреть сообщение
Реплика Ника "Алези пилотирует самую мощную машину" не содержит никакого утверждения о месте, которое займёт этот гонщик, поэтому в дальнейших рассуждениях не учитывается
Ну, если так, то да, но это противоречит
Цитата Сообщение от fred03 Посмотреть сообщение
что каждое из двух предположений двоих друзей подтвердилось, а оба предположения третьего
"каждое из двух" и "оба" это "И", т.е. для точного изложения на Прологе это не прокатит. Ваше предположение, что "Алези пилотирует самую мощную машину" не имеет значения, трансформируется в то, что Паша (не "Реплика Ника") ничего не сказал про победителя...
Однако, тогда дерзайте, - меняем approve(pasha, alesi, yes). на approve(pasha, _, yes). и получаем Win = shum

Как обещал, плюс вариант 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
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
% — Вот увидишь, Шумахер не придет первым, — сказал Дима.
approve(dima, shum, no).
% Первым будет Хилл.
approve(dima, hill, yes).
% — Да нет же, победителем будет, как всегда, Шумахер, — воскликнул Никита.
approve(nik, shum, yes).
% — А об Алези и говорить нечего, ему не быть первым.
approve(nik, alesi, no).
% Паша, к которому обратился Никита, возмутился:
% — Хиллу не видать первого места,
approve(pasha, hill, no).
% а вот Алези пилотирует самую мощную машину.
approve(pasha, _, yes).
 
% По завершении этапа гонок оказалось, что каждое из двух предположений двоих
% друзей подтвердилось, а оба предположения третьего из друзей оказались неверны.
% Кто выиграл этап гонки?
win_race1(Win) :-
  % если один из болельщиков назвал пилота-победителя правильно
  approve(Fan1, Win, yes),
  % и не назвал иначе
  \+ approve(Fan1, Win, no),
  % то другой
  approve(Fan2, _, _),
  % угадал так же,
  approve(Fan2, Win, yes),
  % и, не говорил, что этот пилот не победит
  \+ approve(Fan2, Win, no),
  % а третий
  approve(Fan3, _, _),
  % утверждал, что выигравший пилот не будет победителем,
  approve(Fan3, Win, no),
  % и также не утверждал, что будет
  \+ approve(Fan3, Win, yes),
  % рассуждения вели разные болельщики
  is_distinct([Fan1, Fan2, Fan3]).
 
win_race2(Win) :-
  % подобрать болельщиков перестановкой
  permutation1([dima, nik, pasha], [Fan1, Fan2, Fan3]),
  % если один из болельщиков назвал пилота-победителя правильно
  approve(Fan1, Win, yes),
  % и не назвал иначе
  \+ approve(Fan1, Win, no),
  % то другой
  % угадал так же,
  approve(Fan2, Win, yes),
  % и, не говорил, что этот пилот не победит
  \+ approve(Fan2, Win, no),
  % а третий
  % утверждал, что выигравший пилот не будет победителем,
  approve(Fan3, Win, no),
  % и также не утверждал, что будет
  \+ approve(Fan3, Win, yes).
 
% все элементы списка разные
is_distinct([]).
is_distinct([H | T]) :-
  \+ member1(H, T),
  !,
  is_distinct(T).
 
% принадлежность
member1(X,[X|_]).
member1(X,[_|T]):-
    member1(X,T).
 
% перестановка
permutation1([], []).
permutation1(List, [First|Perm]) :-
        select1(First, List, Rest),
        permutation1(Rest, Perm).
        
% выбор с удалением
select1(X, [X|Tail], Tail).
select1(Elem, [Head|Tail], [Head|Rest]) :-
    select1(Elem, Tail, Rest).
1
794 / 598 / 156
Регистрация: 07.10.2013
Сообщений: 1,327
29.04.2016, 16:25 6
Добьём тему... Потом буду ссылки кидать по аналогам
Кликните здесь для просмотра всего текста
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
% — Вот увидишь, Шумахер не придет первым, — сказал Дима.
approve(dima, shum, no).
% Первым будет Хилл.
approve(dima, hill, yes).
% — Да нет же, победителем будет, как всегда, Шумахер, — воскликнул Никита.
approve(nik, shum, yes).
% — А об Алези и говорить нечего, ему не быть первым.
approve(nik, alesi, no).
% Паша, к которому обратился Никита, возмутился:
% — Хиллу не видать первого места,
approve(pasha, hill, no).
% а вот Алези пилотирует самую мощную машину.
approve(pasha, _, yes).
 
% По завершении этапа гонок оказалось, что каждое из двух предположений двоих
% друзей подтвердилось, а оба предположения третьего из друзей оказались неверны.
% Кто выиграл этап гонки?
win_race1(Win, [Fan1-truth, Fan2-truth, Fan3-lie]) :-
  % если один из болельщиков назвал пилота-победителя правильно
  approve(Fan1, Win, yes),
  % и не назвал иначе
  \+ approve(Fan1, Win, no),
  % то другой
  approve(Fan2, _, _),
  % угадал так же,
  approve(Fan2, Win, yes),
  % и, не говорил, что этот пилот не победит
  \+ approve(Fan2, Win, no),
  % а третий
  approve(Fan3, _, _),
  % утверждал, что выигравший пилот не будет победителем,
  approve(Fan3, Win, no),
  % и также не утверждал, что будет
  \+ approve(Fan3, Win, yes),
  % рассуждения вели разные болельщики
  is_distinct([Fan1, Fan2, Fan3]),
  !.
 
win_race2(Win, [Fan1-truth, Fan2-truth, Fan3-lie]) :-
  % подобрать болельщиков перестановкой
  permutation1([dima, nik, pasha], [Fan1, Fan2, Fan3]),
  % если один из болельщиков назвал пилота-победителя правильно
  approve(Fan1, Win, yes),
  % и не назвал иначе
  \+ approve(Fan1, Win, no),
  % то другой
  % угадал так же,
  approve(Fan2, Win, yes),
  % и, не говорил, что этот пилот не победит
  \+ approve(Fan2, Win, no),
  % а третий
  % утверждал, что выигравший пилот не будет победителем,
  approve(Fan3, Win, no),
  % и также не утверждал, что будет
  \+ approve(Fan3, Win, yes),
  !.
 
% все элементы списка разные
is_distinct([]).
is_distinct([H | T]) :-
  \+ member1(H, T),
  !,
  is_distinct(T).
 
% принадлежность
member1(X,[X|_]).
member1(X,[_|T]):-
    member1(X,T).
 
% перестановка
permutation1([], []).
permutation1(List, [First|Perm]) :-
        select1(First, List, Rest),
        permutation1(Rest, Perm).
        
% выбор с удалением
select1(X, [X|Tail], Tail).
select1(Elem, [Head|Tail], [Head|Rest]) :-
    select1(Elem, Tail, Rest).

Prolog
1
2
3
?- win_race1(Win, Fans).
Win = shum,
Fans = [nik-truth, pasha-truth, dima-lie].
1
29.04.2016, 16:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2016, 16:25
Помогаю со студенческими работами здесь

Определить предикат - логическая формула
Здравствуйте, после неудачных попыток сделать самостоятельно, прошу помочь с заданием: ...

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

Логическая задача: кто украл кошелек?
Необходимо решить задачу на прологе, но даже не знаю с чего начать. Расписала и математическую...

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

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

Логическая задача (снова кто-то разбил окно).
Доброе время суток! C Прологом мало знаком, помогите решить задачки: А) Трое юношей: Коля, Петя...


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

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