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

Нужно избавиться от 2 решения

12.06.2016, 18:14. Показов 736. Ответов 0
Метки нет (Все метки)

При компиляции возникает 2 одинаковое решение, через Findall появляется куча ошибок..


На острове Буяне, что стоит посреди моря-океана, находятся три селения: Правдычино, Кривдино и Середина-на-Половине.
Свои названия эти населенные пункты получили не случайно. Обитатели Правдычина всегда говорят только правду.
Те, кто живет в Кривдине не вымолвят слова, чтобы не солгать. Жители Середины-на-Половине говорят попеременно то правду,
то ложь, причем не как-нибудь: отрицание любого высказанного ими истинного утверждения ложно, отрицание ложного
утверждения истинно. Других селений на острове Буяне нет: каждый островитянин живет в одном из трех перечисленных нами селений.
(Для тех, кто не знаком с географией острова Буяна, сообщаем, что река Половина делит остров на 2 равные части.
Селение Середина-на-Половипе, как показывает само его название, раскинулось па живописных берегах Половины.)
Однажды на остров Буян высадился путешественник, и трое местных жителей пригласили его посидеть за дружеской
беседой в харчевне. Путешественник, осведомленный о "тройственной природе" гостеприимных островитян, прежде всего
вознамерился выяснить, кто из какого селения. В ответ на его вопросы местные жители-назовем их X, Y, Z-ответили следующее.
(1) X: я живу в том же селении, что и Y.
(2) Y: я живу в том же селении, что и Z.
(3) Z: ни X, ни Y мне не "земляки".
(4) X: Z из Середины-на-Половине.
(5) Y: от селения, где живет X, до моего селения такое же расстояние, как от Середины-иа-Половине до Кривдина.
(6) Z: X и Y не из одного селения.
(7) X: пока мы здесь беседовали, Z успел один раз солгать.
(8) Y: зато Х все время изрекал только истину.
(9) Z: последнее утверждение как у X, так и у Y ложно.

Над этими утверждениями путешественнику пришлось изрядно поломать голову.
Так в каких селениях живут X, Y и Z?

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
DOMAINS
        островетянин, селение=symbol
        номер=integer
        список_селений=селение*
        житель=житель(островетянин, селение)
        список_жителей=житель*
        ответы=symbol*
PREDICATES
        nondeterm входит_в(селение, список_селений)
        nondeterm входит_в(житель, список_жителей)
        nondeterm ответ(номер, житель, список_жителей)
        nondeterm проверка(номер, житель, список_жителей,symbol)
        nondeterm решение(список_жителей)
        nondeterm правильные_ответы(селение,ответы)
        
CLAUSES
        входит_в(Голова, [Голова|_]).
        входит_в(Голова, [_|Хвост]) :- входит_в(Голова, Хвост).
        
        
%       (1) X: я живу в том же селении, что и Y.
 
        ответ(1, житель(x, Селение_Х), Живут_в) :- 
                входит_в(житель(x, Селение_Х), Живут_в), входит_в(житель(y, Селение_Y), Живут_в), Селение_Х=Селение_Y. 
                
%       (2) Y: я живу в том же селении, что и Z.
 
        ответ(2, житель(y, Селение_Y), Живут_в) :-
                входит_в(житель(y, Селение_Y), Живут_в), входит_в(житель(z, Селение_Z), Живут_в), Селение_Y=Селение_Z.
                
%       (3) Z: ни X, ни Y мне не "земляки".
 
        ответ(3, житель(z, Селение_Z), Живут_в) :- 
                входит_в(житель(z, Селение_Z), Живут_в), входит_в(житель(x, Селение_Х), Живут_в), 
                входит_в(житель(y, Селение_Y), Живут_в), not(Селение_Z=Селение_Y),  not(Селение_Z=Селение_Х).
                
%       (4) X: Z из Середины-на-Половине.
 
        ответ(4, житель(x, Селение_Х), Живут_в) :- 
                входит_в(житель(z, Селение_Z), Живут_в), Селение_Z="Середина_на_половине".
                
%       (5) Y: от селения, где живет X, до моего селения такое же расстояние, как от Середины-на-Половине до Кривдина 
 
        ответ(5, житель(y, Селение_Y), Живут_в) :- 
                входит_в(житель(y, Селение_Y), Живут_в), входит_в(житель(x, Селение_Х), Живут_в), 
                Селение_Y="Середина_на_половине"; Селение_X="Середина_на_половине".
                
%       (6) Z: X и Y не из одного селения.
 
        ответ(6, житель(z, Селение_Z), Живут_в) :- 
                входит_в(житель(x, Селение_Х), Живут_в), входит_в(житель(y, Селение_Y), Живут_в), not(Селение_Х=Селение_Y).
                
%       (7) X: пока мы здесь беседовали, Z успел один раз солгать.
 
        ответ(7, житель(x, Селение_Х), Живут_в) :- 
                not(ответ(3, житель(z, _), Живут_в)), ответ(6, житель(z, _), Живут_в); 
                not(ответ(6, житель(z, _), Живут_в)), ответ(3, житель(z, _), Живут_в).
                
%       (8) Y: зато Х все время изрекал только истину.
 
        ответ(8, житель(y, _), Живут_в) :- 
                ответ(1, житель(x, Селение_Х), Живут_в), 
                ответ(4, житель(x, Селение_Х), Живут_в), 
                ответ(7, житель(x, Селение_Х), Живут_в).
                
%       (9) Z: последнее утверждение как у X, так и у Y ложно.
 
        ответ(9, житель(z, _), Живут_в) :- 
                not(ответ(7, житель(x, _), Живут_в)),
                not(ответ(8, житель(y, _), Живут_в)).
 
        проверка(Номер_ответа, Житель, Живут_в,"истина") :-
                ответ(Номер_ответа, Житель, Живут_в).
        проверка(Номер_ответа, Житель, Живут_в,"ложь") :-
                not(ответ(Номер_ответа, Житель, Живут_в)).
                                            
        правильные_ответы("Правдычино",["истина","истина","истина"]).
        правильные_ответы("Кривдино",["ложь","ложь","ложь"]).
        правильные_ответы("Середина_на_половине",["истина","ложь","истина"]).
        правильные_ответы("Середина_на_половине",["ложь","истина","ложь"]).
        
        
        решение(Живут_в) :-
           
                Селения=["Правдычино", "Кривдино", "Середина_на_половине"],
                входит_в(Селение_Х, Селения), входит_в(Селение_Y, Селения), входит_в(Селение_Z, Селения),
                Живут_в=[житель(x, Селение_Х), житель(y, Селение_Y), житель(z, Селение_Z)],
                правильные_ответы(Селение_Х,[ОтветX1,ОтветX2,ОтветX3]),
                правильные_ответы(Селение_Y,[ОтветY1,ОтветY2,ОтветY3]),
                правильные_ответы(Селение_Z,[ОтветZ1,ОтветZ2,ОтветZ3]),
                
                not(Селение_Х=Селение_Y),
                not(Селение_Х=Селение_Z),
                not(Селение_Y=Селение_Z),
             
                проверка(1, житель(x, Селение_Х), Живут_в,ОтветX1), 
                проверка(2, житель(y, Селение_Y), Живут_в,ОтветY1), 
                проверка(3, житель(z, Селение_Z), Живут_в,ОтветZ1), 
                проверка(4, житель(x, Селение_Х), Живут_в,ОтветX2),
                проверка(5, житель(y, Селение_Y), Живут_в,ОтветY2), 
                проверка(6, житель(z, Селение_Z), Живут_в,ОтветZ2),
                проверка(7, житель(x, Селение_Х), Живут_в,ОтветX3), 
                проверка(8, житель(y, Селение_Y), Живут_в,ОтветY3),
                проверка(9, житель(z, Селение_Z), Живут_в,ОтветZ3).   
GOAL
        решение(Живут_в).
Добавлено через 3 часа 56 минут
ошибка, которая возникает, при использовании findall
E;Test_Goal, pos: 7176, 404 Undeclared predicate, misspelling or not supported on chosen platform житель

программа с findall

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
DOMAINS
        островетянин, селение=symbol
        номер=integer
        список_селений=селение*
        житель=житель(островетянин, селение)
        список_жителей=житель*
        ответы=symbol*
        
        количество = integer
%   список_селений = селение*
PREDICATES
        nondeterm входит_в(селение, список_селений)
        nondeterm входит_в(житель, список_жителей)
        nondeterm ответ(номер, житель, список_жителей)
        nondeterm проверка(номер, житель, список_жителей,symbol)
        nondeterm решение(список_жителей)
        nondeterm правильные_ответы(селение,ответы)
        
        nondeterm отфильтровать_список_решений(список_селений,количество,список_селений)
    nondeterm содержится_в(селение,список_селений)
    nondeterm найти_решения(список_селений) 
        
        
CLAUSES
        входит_в(Голова, [Голова|_]).
        входит_в(Голова, [_|Хвост]) :- входит_в(Голова, Хвост).
        
        
%       (1) X: я живу в том же селении, что и Y.
 
        ответ(1, житель(x, Селение_Х), Живут_в) :- 
                входит_в(житель(x, Селение_Х), Живут_в), входит_в(житель(y, Селение_Y), Живут_в), Селение_Х=Селение_Y. 
                
%       (2) Y: я живу в том же селении, что и Z.
 
        ответ(2, житель(y, Селение_Y), Живут_в) :-
                входит_в(житель(y, Селение_Y), Живут_в), входит_в(житель(z, Селение_Z), Живут_в), Селение_Y=Селение_Z.
                
%       (3) Z: ни X, ни Y мне не "земляки".
 
        ответ(3, житель(z, Селение_Z), Живут_в) :- 
                входит_в(житель(z, Селение_Z), Живут_в), входит_в(житель(x, Селение_Х), Живут_в), 
                входит_в(житель(y, Селение_Y), Живут_в), not(Селение_Z=Селение_Y),  not(Селение_Z=Селение_Х).
                
%       (4) X: Z из Середины-на-Половине.
 
        ответ(4, житель(x, Селение_Х), Живут_в) :- 
                входит_в(житель(z, Селение_Z), Живут_в), Селение_Z="Середина_на_половине".
                
%       (5) Y: от селения, где живет X, до моего селения такое же расстояние, как от Середины-на-Половине до Кривдина 
 
        ответ(5, житель(y, Селение_Y), Живут_в) :- 
                входит_в(житель(y, Селение_Y), Живут_в), входит_в(житель(x, Селение_Х), Живут_в), 
                Селение_Y="Середина_на_половине"; Селение_X="Середина_на_половине".
                
%       (6) Z: X и Y не из одного селения.
 
        ответ(6, житель(z, Селение_Z), Живут_в) :- 
                входит_в(житель(x, Селение_Х), Живут_в), входит_в(житель(y, Селение_Y), Живут_в), not(Селение_Х=Селение_Y).
                
%       (7) X: пока мы здесь беседовали, Z успел один раз солгать.
 
        ответ(7, житель(x, Селение_Х), Живут_в) :- 
                not(ответ(3, житель(z, _), Живут_в)), ответ(6, житель(z, _), Живут_в); 
                not(ответ(6, житель(z, _), Живут_в)), ответ(3, житель(z, _), Живут_в).
                
%       (8) Y: зато Х все время изрекал только истину.
 
        ответ(8, житель(y, _), Живут_в) :- 
                ответ(1, житель(x, Селение_Х), Живут_в), 
                ответ(4, житель(x, Селение_Х), Живут_в), 
                ответ(7, житель(x, Селение_Х), Живут_в).
                
%       (9) Z: последнее утверждение как у X, так и у Y ложно.
 
        ответ(9, житель(z, _), Живут_в) :- 
                not(ответ(7, житель(x, _), Живут_в)),
                not(ответ(8, житель(y, _), Живут_в)).
 
        проверка(Номер_ответа, Житель, Живут_в,"истина") :-
                ответ(Номер_ответа, Житель, Живут_в).
        проверка(Номер_ответа, Житель, Живут_в,"ложь") :-
                not(ответ(Номер_ответа, Житель, Живут_в)).
                                            
        правильные_ответы("Правдычино",["истина","истина","истина"]).
        правильные_ответы("Кривдино",["ложь","ложь","ложь"]).
        правильные_ответы("Середина_на_половине",["истина","ложь","истина"]).
        правильные_ответы("Середина_на_половине",["ложь","истина","ложь"]).
        
        
        решение(Живут_в) :-
           
                Селения=["Правдычино", "Кривдино", "Середина_на_половине"],
                входит_в(Селение_Х, Селения), входит_в(Селение_Y, Селения), входит_в(Селение_Z, Селения),
                Живут_в=[житель(x, Селение_Х), житель(y, Селение_Y), житель(z, Селение_Z)],
                правильные_ответы(Селение_Х,[ОтветX1,ОтветX2,ОтветX3]),
                правильные_ответы(Селение_Y,[ОтветY1,ОтветY2,ОтветY3]),
                правильные_ответы(Селение_Z,[ОтветZ1,ОтветZ2,ОтветZ3]),
                
                not(Селение_Х=Селение_Y),
                not(Селение_Х=Селение_Z),
                not(Селение_Y=Селение_Z),
             
                проверка(1, житель(x, Селение_Х), Живут_в,ОтветX1), 
                проверка(2, житель(y, Селение_Y), Живут_в,ОтветY1), 
                проверка(3, житель(z, Селение_Z), Живут_в,ОтветZ1), 
                проверка(4, житель(x, Селение_Х), Живут_в,ОтветX2),
                проверка(5, житель(y, Селение_Y), Живут_в,ОтветY2), 
                проверка(6, житель(z, Селение_Z), Живут_в,ОтветZ2),
                проверка(7, житель(x, Селение_Х), Живут_в,ОтветX3), 
                проверка(8, житель(y, Селение_Y), Живут_в,ОтветY3),
                проверка(9, житель(z, Селение_Z), Живут_в,ОтветZ3).   
                
                найти_решения(Список_уникальный_селений) :-
            findall(Селения,житель(Житель, Селение), Селения),
            отфильтровать_список_решений(Селения,Количество_уникальных_селений,Список_уникальный_селений).
GOAL
     %   решение(Живут_в).
     найти_решения(Список_селений).
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2016, 18:14
Ответы с готовыми решениями:

Нужно избавиться от события onchange
Я получаю select парсингом (JS), а в селекте есть встроенное событие onchange от которого нужно...

Нужно избавиться от зацикливания вывода сообщения
Помогите доработать программу, нужно избавиться от зацикливания вывода сообщения! var n:...

Навязчивое Super Radio, нужно избавиться
Привет, суть дела в том, что вылетает баннеры все время от Super Radio. Нужно избавиться от него....

Нужно найти путь решения
Мне нужно объединить эти две таблицы, произвести выборку так, чтобы поле в in было слово sun, и уже...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2016, 18:14
Помогаю со студенческими работами здесь

Как избавиться от ошибки "ORA-12560: TNS:protocol adapter error"? Очень нужно!
Данная ошибка возникает в командной строке при попытке зайти в sqlplus. Пожалуйста, подскажите,...

Нужно написать программу решения уравнений на VB
С информатикой не знаком совсем , прошу вашей помощи. Нужен код и блок-схема на VB для решения...

Нужно составить программу для решения y=✓x
Program

нужно составить алгоритм решения для 5 задач
и лучше конечно было бы на scheme


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

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

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