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

Логическая задача с правдивыми и ложными высказываниями

06.12.2015, 23:58. Показов 2521. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! По курсу Пролога пытаюсь решить следующую задачу:

Тетушка Амелия побывала в Париже в гостях у трех своих маленьких племянников и много гуляла с ними по городу. После этого каждый из них рассказал следующее. Первый племянник. Мы поднялись на Эйфелеву башню, но не были на Монпарнасе, однако мы посетили Триумфальную арку. Второй племянник. Мы поднялись на Эйфелеву башню и побывали на Монпарнасе. Нo мы не посещали ни Триумфальную арку, ни зал для игры в мяч. Третий племянник. Мы не поднимались на Эйфелеву башню, но посетили Триумфальную арку.

Если каждый ребенок солгал один (и только один) раз, то какие достопримечательности Парижа посетили они вместе с тетушкой Амелией на самом деле?

Никакие мысли в голову не приходили. После беседы с преподавателем все равно не разобралась, но попыталась что-то изобразить, это, конечно, не работает. В итоге хочу получить список мест, где были, но не знаю, как его задать. Посмотрите пожалуйста, кому не лень

Заранее спасибо за помощь и ваши идеи!
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
DOMAINS
    племянник,место = symbol
    номер = integer
    признак=правда;ложь
    высказывание=высказывание(племянник,номер,место,признак)
    список = место*
    список_номеров = номер*
PREDICATES 
 
    nondeterm сказал(племянник,номер,место)
    nondeterm проверка_высказывания(высказывание)
    nondeterm посетили(список)
    nondeterm один_из(номер,список_номеров)
    nondeterm один_из(место,список)
CLAUSES
    один_из(Место,[Место|_]).
    один_из(Место,[_|Хвост]):-один_из(Место,Хвост).
 
    один_из(Номер_высказывания,[Номер_высказывания|_]).
    один_из(Номер_высказывания,[_|Хвост]):-один_из(Номер_высказывания,Хвост).
 
%Первый племянник. Мы поднялись на Эйфелеву башню, 
    сказал(ребенок1,1,Место_посещения):- Место_посещения = эйфелева_башня.
%но не были на Монпарнасе, 
    сказал(ребенок1,2,Место_посещения):- not(Место_посещения = монпарнас).
%однако мы посетили Триумфальную арку.  
    сказал(ребенок1,3,Место_посещения):- Место_посещения = триумфальная_арка.
     
%Второй племянник. Мы поднялись на Эйфелеву башню 
    сказал(ребенок2,1,Место_посещения):- Место_посещения = эйфелева_башня.
%и побывали на Монпарнасе. 
    сказал(ребенок2,2,Место_посещения):- Место_посещения = монпарнас.
%Нo мы не посещали ни Триумфальную арку,
    сказал(ребенок2,3,Место_посещения):- not(Место_посещения = триумфальная_арка).
% ни зал для игры в мяч.
    сказал(ребенок2,4,Место_посещения):- not(Место_посещения = зал_для_игры_в_мяч).
 
%Третий племянник. Мы не поднимались на Эйфелеву башню,
    сказал(ребенок3,1,Место_посещения):- not(Место_посещения = эйфелева_башня).
% но посетили Триумфальную арку.
    сказал(ребенок3,2,Место_посещения):- Место_посещения = триумфальная_арка.
 
 
    проверка_высказывания(высказывание(Ребенок,Номер,Место_Парижа,Характер)):-
    Характер=правда, сказал(Ребенок,Номер,Место_Парижа);
    Характер=ложь, not(сказал(Ребенок,Номер,Место_Парижа)).
 
    посетили(Места):-
 
    N1=[1,2,3], N2=[1,2,3,4], N3=[1,2],
    один_из(Н11,N1),один_из(Н12,N1),один_из(Н13,N1),
    один_из(Н21,N2),один_из(Н22,N2),один_из(Н23,N2),один_из(Н24,N2),
    один_из(Н31,N3),один_из(Н32,N3),
 
    not(Н11=Н12),not(Н11=Н13),not(Н12=Н13),
    not(Н21=Н22),not(Н21=Н23),not(Н21=Н24),not(Н22=Н23),not(Н22=Н24),not(Н23=Н24),
    not(Н31=Н32),
 
    
    not(Место11=Место12),not(Место11=Место13),not(Место12=Место13),
    not(Место21=Место22),not(Место21=Место23),not(Место21=Место24),not(Место22=Место23),not(Место22=Место24),not(Место23=Место24),
    not(Место31=Место32),
    проверка_высказывания(высказывание(ребенок1,Н11,Место11,правда)),
    проверка_высказывания(высказывание(ребенок1,Н12,Место12,правда)),
    проверка_высказывания(высказывание(ребенок1,Н13,Место13,ложь)),
    проверка_высказывания(высказывание(ребенок2,Н21,Место21,правда)),
    проверка_высказывания(высказывание(ребенок2,Н22,Место22,правда)),
    проверка_высказывания(высказывание(ребенок2,Н23,Место23,правда)),
    проверка_высказывания(высказывание(ребенок2,Н24,Место24,ложь)),
    проверка_высказывания(высказывание(ребенок3,Н31,Место31,правда)),
    проверка_высказывания(высказывание(ребенок3,Н32,Место32,ложь)),
 
    Места=[сказал(_,_,_)|_].
 
 
GOAL
    посетили(Места).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2015, 23:58
Ответы с готовыми решениями:

Логическая задача
Помогите пожалуйста!! Дана логическая задача: Друзья обсуждают поход на дискотеку. 1. Если ни...

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

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

Логическая задача
Здравствуйте, вот такая задачка подвернулась сегодня. Могу решить простым копированием значений...

2
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
07.12.2015, 06:33 2
Вам нужно последовательно сделать такие шаги
1) Сформировать гипотезу - подсписок списка достопримечательностей. Или, если хотите, задать значения посетили/не посетили для каждой достопримечательности (что есть то же самое)

Этого шага у Вас нет в принципе, даже набросков..

2) Исходя из принятой гипотезы, проверить истинности конкретных ответов мальчиков. Не наоборот

Тут Вы что-то начали делать, но очень странно.. Например, Вы почему-то берете одно Место_посещения и сравниваете с ответами мальчиков напрямую, хотя у Вас написан чудесный предикат один_из..

3) Посчитать количество неверных ответов и сравнить с требуемым

Этого шага у Вас тоже нет.

4) Если всё сошлось, напечатать список
0
0 / 0 / 0
Регистрация: 06.12.2015
Сообщений: 2
08.12.2015, 00:28  [ТС] 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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
DOMAINS
    племянник,место = symbol
    номер = integer
    признак=правда;ложь
    значение=были;не_были
    высказывание = высказывание(племянник,номер,место)
    список = место*
    список_номеров = номер*
    список_высказываний = высказывание*
    статус = статус(место,значение)
    племянники=племянник*
PREDICATES
    nondeterm дети(племянники)
    nondeterm достопримечательности(список)
    nondeterm сказал(племянник,номер,место)
    nondeterm проверка_высказывания(высказывание)
    nondeterm посетили(список)
    nondeterm один_из(номер,список_номеров)
    nondeterm один_из(место,список)
    nondeterm один_из(высказывание,список_высказываний)
CLAUSES
    один_из(Место,[Место|_]).
    один_из(Место,[_|Хвост]):-один_из(Место,Хвост).
 
    один_из(Номер_высказывания,[Номер_высказывания|_]).
    один_из(Номер_высказывания,[_|Хвост]):-один_из(Номер_высказывания,Хвост).
 
    один_из(Высказывание,[Высказывание|_]).
    один_из(Высказывание,[_|Хвост]):-один_из(Высказывание,Хвост).
 
    проверка_высказывания(высказывание(Ребенок,Номер,Место_Парижа)):-
     сказал(Ребенок,Номер,Место_Парижа).
    
    проверка_высказывания(высказывание(Ребенок,Номер,Место_Парижа)):-
     not(сказал(Ребенок,Номер,Место_Парижа)).
    
    достопримечательности(Дост):- Дост = [эйфелева_башня, монпарнас, триумфальная_арка, зал_для_игры_в_мяч].
    дети(Племянники):- Племянники = [ребенок1, ребенок2, ребенок3].
    
    %Первый племянник. Мы поднялись на Эйфелеву башню, 
    сказал(ребенок1,1,Место_11):- Место_11 = эйфелева_башня, статус(Место_11,были).
%но не были на Монпарнасе, 
    сказал(ребенок1,2,Место_12):-  Место_12 = монпарнас, статус(Место_12,не_были).
%однако мы посетили Триумфальную арку.  
    сказал(ребенок1,3,Место_13):- Место_13 = триумфальная_арка, статус(Место_13,были).
     
%Второй племянник. Мы поднялись на Эйфелеву башню 
    сказал(ребенок2,1,Место_21):- Место_21 = эйфелева_башня, статус(Место_21,были).
%и побывали на Монпарнасе. 
    сказал(ребенок2,2,Место_22):- Место_22 = монпарнас, статус(Место_22,были).
%Нo мы не посещали ни Триумфальную арку,
    сказал(ребенок2,3,Место_23):- Место_23 = триумфальная_арка, статус(Место_23,не_были).
% ни зал для игры в мяч.
    сказал(ребенок2,4,Место_24):- Место_24 = зал_для_игры_в_мяч, статус(Место_24,не_были).
 
%Третий племянник. Мы не поднимались на Эйфелеву башню,
    сказал(ребенок3,1,Место_31):- Место_31 = эйфелева_башня, статус(Место_31,не_были).
% но посетили Триумфальную арку.
    сказал(ребенок3,2,Место_32):- Место_32 = триумфальная_арка, статус(Место_32,были).
    
    посетили(Места):-
    
    статус(Место_Парижа_1, были),статус(Место_Парижа_2, были),статус(Место_Парижа_3, были),
    
        Места=[Место_Парижа_1, Место_Парижа_2, Место_Парижа_3],
    
    
    N1=[1,2,3], N2=[1,2,3,4], N3=[1,2],
    один_из(Н11,N1),один_из(Н12,N1),один_из(Н13,N1),
    один_из(Н21,N2),один_из(Н22,N2),один_из(Н23,N2),один_из(Н24,N2),
    один_из(Н31,N3),один_из(Н32,N3),
 
    not(Н11=Н12),not(Н11=Н13),not(Н12=Н13),
    not(Н21=Н22),not(Н21=Н23),not(Н21=Н24),not(Н22=Н23),not(Н22=Н24),not(Н23=Н24),
    not(Н31=Н32),
 
    один_из(Место11,Места),один_из(Место12,Места),один_из(Место13,Места),
    один_из(Место21,Места),один_из(Место22,Места),один_из(Место23,Места),один_из(Место24,Места),
    один_из(Место31,Места),один_из(Место32,Места),
    
    В11=высказывание(ребенок1,Н11,Место11,правда),
    В12=высказывание(ребенок1,Н12,Место12,правда),
    В13=высказывание(ребенок1,Н13,Место13,ложь),
    В21=высказывание(ребенок2,Н21,Место21,правда),
    В22=высказывание(ребенок2,Н22,Место22,правда),
    В23=высказывание(ребенок2,Н23,Место23,правда),
    В24=высказывание(ребенок2,Н24,Место24,ложь),
    В31=высказывание(ребенок3,Н31,Место31,правда),
    В32=высказывание(ребенок3,Н32,Место32,ложь),
    Высказывания=[В11,В12,В13,В21,В22,В23,В24,В31,В32],
 
    один_из(D1,Высказывания),
        проверка_высказывания(D1),
        
        один_из(D2,Высказывания), not(D1=D2),
        проверка_высказывания(D2),
        
        один_из(D3,Высказывания), not(D1=D3),not(D2=D3),
        проверка_высказывания(D3),
        
        один_из(D4,Высказывания), not(D1=D4),not(D2=D4),not(D3=D4),
        проверка_высказывания(D4),
        
        один_из(D5,Высказывания), not(D1=D5),not(D2=D5),not(D3=D5),not(D4=D5),
                проверка_высказывания(D5),
                         
        один_из(D6,Высказывания), not(D1=D6),not(D2=D6),not(D3=D6),not(D4=D6),
                         not(D5=D6),
        проверка_высказывания(D6),
                         
        один_из(D7,Высказывания), not(D1=D7),not(D2=D7),not(D3=D7),not(D4=D7),
                         not(D5=D7),not(D6=D7),
                проверка_высказывания(D7),
                         
        один_из(D8,Высказывания), not(D1=D8),not(D2=D8),not(D3=D8),not(D4=D8),
                             not(D5=D8),not(D6=D8),not(D7=D8),
                проверка_высказывания(D8),
                         
        один_из(D9,Высказывания), not(D1=D9),not(D2=D9),not(D3=D9),not(D4=D9),
                         not(D5=D9),not(D6=D9),not(D7=D9),not(D8=D9),
                проверка_высказывания(D9).
 
 
GOAL
    посетили(Места).
0
08.12.2015, 00:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2015, 00:28
Помогаю со студенческими работами здесь

логическая задача
Решить методом полного перебора задачу и разработать программу на CLOS (Lisp) для ее решения тем же...

Задача логическая
Недопонимаю как решить!!!! Помогите решить,пожалуйста, в Turbo Prolog без использования...

Логическая задача
Решить нужно с двумя if и else. Без циклов и массивов. Вова попал на космическом корабле на...

Логическая задача
Дано последовательность с N чисел, которая имеет разные числа от 0 до N. Определить, какого числа...

Логическая задача
Помогите решить задачу! Построить базу знаний «Рабочая смена»: Мария работает в дневную смену....

Логическая задача
Привет,помогите придумать алгоритм, действий к этой задаче. Есть несколько переменных типа bool...


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

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