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

Решение логической задачи на языке Prolog (SWI или GNU)

28.10.2016, 00:24. Показов 2602. Ответов 1

Author24 — интернет-сервис помощи студентам
Здравствуйте, мне нужно решить логическую с использованием Prolog'a, никак не получается решить, помогите, пожалуйста. Заранее благодарен!

Текст задачи:
Борисов, Кириллов, Данин и Савин - инженеры. Один из них- автомеханик, другой- химик, третий- строитель, четвертый- радиотехник. Борисов, который обыгрывает в шахматы Данина, но проигрывает Савину, бегает на лыжах лучше того инженера, который моложе его, и ходит в театр чаще, чем тот инженер, который старше Кириллова. Химик, который посещает, театр чаще, чем автомеханик, но реже, чем строитель, не является ни самым молодым, ни самым старшим из этой четверки. Строитель, который на лыжах бегает хуже, чем радиотехник, как правило, проигрывает в шахматных сражениях автомеханику. Самый пожилой из инженеров лучше всех играет в шахматы и чаще всех бывает в театре, а самый молодой лучше всех ходит на лыжах. Назовите профессии каждого из инженеров, если известно, что ни в спорте, ни в приверженности к театру среди них нет двух одинаковых.

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
leng([],0). % длина списка
leng([_|Y],N):-
    leng(Y,M),
    N is M+1.
 
memb(X,[X|_]). % проверка на принадлежность
memb(X,[_|Y]):-
memb(X,Y).
 
app([],X,X). % слияние списков
app([X|Y],Z,[X|T]):-
    app(Y,Z,T).
 
subl(Sub,List):- % проверка вхождения
    app(_,Y2,List), %списка в качестве подсписка
    app(Sub,_,Y2).
 
rem(X, [X|T], T). % удаление из списка
rem(X, [Y|T], [Y|T1]):-
    rem(X,T,T1).
 
perm([],[]):-!. % перестановка списка
perm(L,[X|T]):-
    rem(X,L,R),
    perm(R,T).
 
surname(borisov).
surname(kirillov).
surname(danin).
surname(savin).
 
prof(mechanic).
prof(chemist).
prof(builder).
prof(radioman).
 
last1([_,_,_,D],D).
third([_,_,C,_],C).
second([_,B,_,_],B).
first([A,_,_,_],A).
 
xy(X,Y,[X|T]):- %предикат отношения: Х находится в списке позже Y
    memb(Y,T).
xy(X,Y,[A|T]):-
    xy(X,Y,T).
%Чем кто-то из инженеров лучше играет в шахматы, бегает на лыжах, и т.д.,
%тем ближе он к концу списка. (упорядочены по возрастанию умений/возраста)
%Список Chess для составления отношений умений игры в шахматы, остальные аналогично.
%Res- результат.
solve(Res):-
    perm([borisov, kirillov, danin, savin], [X1,X2,X3,X4]),
    perm([mechanic, chemist, builder, radioman],[Y1,Y2,Y3,Y4]),
 
    Res = [p(X1,Y1),p(X2,Y2),p(X3,Y3),p(X4,Y4)],
    perm(Res,Age),
 
    \+first(Age,p(borisov,_)),
    \+last1(Age,p(borisov,_)),
 
    \+last1(Age,p(kirillov,_)),
 
    \+first(Age,p(_,chemist)),
    \+last1(Age,p(_,chemist)),
 
    perm(Res,Chess),
 
    last1(Age,Oldest),
    last1(Chess,Oldest),
    xy(p(danin,_),p(borisov,_),Chess),
 
    xy(p(borisov,_),p(savin,_),Chess),
 
    xy(p(_,builder),p(_,mechanic),Chess),
 
    perm(Res,Theater),
 
    last1(Theater,Oldest),
    xy(p(_,mechanic),p(_,chemist),Theater),
    xy(p(_,chemist),p(_,builder),Theater),
 
    xy(p(kirillov,_),A,Age),
    xy(A,p(borisov,_),Theater),
 
    perm(Res,Ski),
 
    first(Age,Youngest),
    last1(Ski,Youngest),
    xy(p(_,builder),p(_,radioman),Ski),
 
    xy(F,p(_,borisov),Age),
    xy(F,p(_,borisov),Ski).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2016, 00:24
Ответы с готовыми решениями:

Решение логической задачи про птиц на Visual Prolog 5.2
Доброго времени суток! Очень нужна помощь в решении задачи. В одном городе живут семь любителей...

Нужно полное решение логической задачи на Visual Prolog
Пожалуйста, помогите решить вот такую логическую задачу на Visual Prolog. Браун, Гриффит,...

Матрица с равной суммой чисел. GNU Prolog, в крайнем случае SWI. Устранение ошибки и доведение до работоспособного состояния
Помогите найти ошибки и довести программу до работоспособного состояния. Prolog GNU (нужен...

SWI Prolog две задачи
1) Нужно определить предикат, который будет считывать с консоли строку текста до точки. Если не...

1
1 / 1 / 0
Регистрация: 21.05.2016
Сообщений: 17
29.10.2016, 20:28  [ТС] 2
Если вдруг кого заинтересует решение. Возможно существует решение и красивее, но я решил так. В списке Res инженеры отсортированы в порядке увеличения возраста, в остальных аналогично по возрастанию умений/посещения.
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
memb(X,[X|_]). % проверка на принадлежность
memb(X,[_|Y]):-
memb(X,Y).
 
rem(X, [X|T], T). % удаление из списка
rem(X, [Y|T], [Y|T1]):-
    rem(X,T,T1).
 
perm([],[]):-!. % перестановка списка
perm(L,[X|T]):-
    rem(X,L,R),
    perm(R,T).
 
surname(borisov).
surname(kirillov).
surname(danin).
surname(savin).
 
prof(mechanic).
prof(chemist).
prof(builder).
prof(radioman).
 
last([_,_,_,D],D).
third([_,_,C,_],C).
second([_,B,_,_],B).
first([A,_,_,_],A).
 
xy(X,Y,[X|T]):- %предикат отношения. Х находится в списке раньше, чем Y
    memb(Y,T).
xy(X,Y,[A|T]):-
    xy(X,Y,T).
 
result(Ski):- %Борисов, Кириллов, Данин, Санин
    perm([borisov, kirillov, danin, savin], [X1,X2,X3,X4]),
    perm([mechanic, chemist, builder, radioman],[Y1,Y2,Y3,Y4]),
 
    Res = [p(X1,Y1),p(X2,Y2),p(X3,Y3),p(X4,Y4)],
 
    \+last(Res,p(borisov,_)),
    \+first(Res,p(borisov,_)),
    \+last(Res,p(kirillov,_)),
 
    \+first(Res,p(_,chemist)),
    \+last(Res,p(_,chemist)),
 
    perm(Res,Chess),
    last(Res,Oldest),
    last(Chess,Oldest),
    \+last(Chess,p(borisov,_)),
    \+first(Chess,p(borisov,_)),
 
    xy(p(borisov,_),p(savin,_),Chess),
    xy(p(danin,_),p(borisov,_),Chess),
 
    xy(p(_,builder),p(_,mechanic),Chess),
 
    perm(Res,Theater),
    last(Theater,Oldest),
 
    xy(p(_,mechanic),p(_,chemist),Theater),
    xy(p(_,chemist),p(_,builder),Theater),
 
    xy(p(kirillov,_),A,Res),
    xy(A,p(borisov,_),Theater),
 
    perm(Res,Ski),
    first(Res,Youngest),
    last(Ski,Youngest),
    \+first(Ski,p(borisov,_)),
    xy(p(_,builder),p(_,radioman),Ski).
 
    xy(M,p(borisov,_),Res),
 
    xy(M,p(borisov,_),Ski).
1
29.10.2016, 20:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2016, 20:28
Помогаю со студенческими работами здесь

Решение логической задачи
Решите следующую задачу (автор - В. Н. Касаткин). Алеша, Боря и Гриша нашли в земле сосуд....

Формальное решение логической задачи
Всем привет. Есть такая задача: 1) "Если Иванов не участвовал или Петров участвовал, то...

Поиск в глубину или ширину (SWI Prolog)
Помогите решить задачу! Найти все пути из Москвы в Новосибирск, проходящие через Пермь. Нужно...

Решение формально-логической задачи на Lisp
Ребята помогите пожалуйста решить задачу на Lisp. Очень срочно, я вообще не программировала на...


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

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