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

Логическая задача на TurboProlog

23.12.2015, 22:41. Показов 2088. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста написать задачу на TurboProlog. Для четырех дружинников, фамилии которых начинаются буквами А, Е, Р, С, необходимо составить график дежурств на четыре вечера подряд, учитывая, что:
1) С и Р не могут дежурить в первый вечер в связи с командировкой:
2) если С выйдет во второй вечер или Р — в третий, то Е сможет подежурить в четвертый;
3) если А не будет дежурить в третий вечер, то Е согласен дежурить во второй вечер;
4) если Р в четвертый вечер уедет на конференцию, то А придется дежурить в первый, а С в третий вечер.

Добавлено через 4 часа 32 минуты
мой код не работает
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
domains
slist=string*
man=m(string,string).
men=man*
 
predicates
permutation(slist,slist).
insert(string,slist,slist).
solve(men).
z(string,string).
check1(string,string,string,string).
clases
insert(X,L,[X|L]).
insert(X,[H|Tail],[H|NewTail]):-insert(X,Tail,NewTail).
permutation([],[]).
permutation([H|Tail],P):-permutation(Tail,PTail),insert(H,PTail,P).
check1([N,_,_,_]):-N<>"c";N<>"p".
check1([_,D,B,"e"]):-C="c";B="p".
check1([_,"e",M,_]):-M<>"a".
check1(["a",_,"e",H]):-h<>"p".
solve(S):-
    permutation(["a","e","p","c"],S),
    check1(S).
Ошибка 404 undeclared predicate or misspelling
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2015, 22:41
Ответы с готовыми решениями:

Задача в TurboProlog
Решите пожалуйста задачу!!!! Постройте информационно-логическую модель «Родственные отношения»...

Логическая задача
Помогите пожалуйста решить !!! Напишите процедуры, вывода максимума и минимума двух чисел

Логическая задача
Ребят помогите пожалуйста... ПРЕСТУПНИКИ-РЕЦИДИВИСТЫ Три преступника-рецидивиста, подозреваемые в...

Логическая задача
Пять человек- Саша, Борис, Виталий, Лена и Дмитрий живут в 5 разных городах: Хабаровск, Ульяновск,...

5
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
24.12.2015, 04:33 2
Конкретно эта ошибка из-за-того, что в строке 12 неправильное ключевое слово. Должно быть clauses.
А вообще еще много мелких описок.
И логическая ошибка: у Вас один предикат check1 с четырьмя разными ветками, для четырех проверок.
Но ветки одного предиката соединяются условием ИЛИ, а Вам на самом деле нужно И.
Сделайте четыре разных предиката check1-check4 и все последовательно вызовите из solve.
1
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
24.12.2015, 04:37 3
Вообще, нужна хорошая обработка напильником.
Но даже после этого решений выпадает много:
И заметно, что выпадают пары одинаковых решений, значит, даёт дубли Ваш permutation.
Миниатюры
Логическая задача на TurboProlog  
0
0 / 0 / 0
Регистрация: 22.12.2015
Сообщений: 9
24.12.2015, 16:07  [ТС] 4
Вот я вроде переделала код, но теперь Solve не имеет решения, а все остальные предикаты по отдельности работают
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
domains
slist=string*
predicates
permutation(slist,slist)
insert(string,slist,slist)
solve(slist)
check1(slist)
check2(slist)
check3(slist)
check4(slist)
clauses
insert(X,[X|L],L).
insert(X,[H|Tail],[H|NewTail]):-insert(X,Tail,NewTail).
permutation([],[]).
permutation(S,[H|Tail]):-insert(H,S,P),permutation(P,Tail).
check1([N,_,_,_]):-N<>"c",N<>"p".
check2([_,C,B,"e"]):-C="c";B="p".
check3([_,"e",M,_]):-M<>"a".
check4(["a",_,"e",H]):-H<>"p".
solve(S):-permutation(["a","e","p","c"],S),check1(S),check2(S),check3(S),check4(S).
0
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
24.12.2015, 21:41 5
Лучший ответ Сообщение было отмечено Kristine как решение

Решение

Вторую, третью и четвертую проверки надо "закрыть" дополнительным правилом.

Напишу через пару часов, с телефона очень неудобно..

Добавлено через 3 часа 51 минуту
На первый взгляд, надо примерно так:
Prolog
1
2
3
4
5
6
7
8
9
10
11
check2([_,С,B,"e"]) :- !, 
    D="c";B="p". 
check2(_).
 
check3([_,"e",M,_]) :- !,
    M<>"a". 
check3(_).
 
check4(["a",_,"e",H]) :- !,
    H<>"p". 
check4(_).
Но что-то мне вообще не очень нравятся формулировки условий..
Я ночью подумаю и напишу подробнее
1
0 / 0 / 0
Регистрация: 22.12.2015
Сообщений: 9
26.12.2015, 12:30  [ТС] 6
Спасибо, а можно как-то эту задачу решить без отсечения?
0
26.12.2015, 12:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2015, 12:30
Помогаю со студенческими работами здесь

Логическая задача
Помогите решить задачу!!! Шесть спортсменов – Адамов, Белов, Ветров, Глебов, Дронов и Ершов – в...

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

Логическая задача
Помогите, пожалуйста дописать решение задачи: Браун, Гриффит, Клеменс и Грин -четверо студентов...

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

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

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


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

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