Задача про лагерь Артек и ребят. Переделать решение - Prolog
Формулировка задачи:
Здравствуйте. Есть задача:
Есть решение с использованием списков:
Помогите пожалуйста переписать решение без использования списков, только через предикаты.
Однажды в Артеке за круглым столом оказалось пятеро ребят родом из Москвы, Санкт-Петербурга, Новгорода, Перми и Томска: Юра, Толя, Алеша, Коля и Витя. Москвич сидел между томичем и Витей, санкт-петербуржец - между Юрой и Толей, а напротив него сидели пермяк и Алеша. Коля никогда не был в Санкт-Петербурге, а Юра не бывал в Москве и Томске, а томич с Толей регулярно переписываются. Определите, в каком городе живет каждый из ребят.
Листинг программы
- domains
- strings_d = string*
- live_d = live(string, string) % who, where
- live_list_d = live_d*
- predicates
- nondeterm man(string)
- nondeterm city(string)
- nondeterm member(string, strings_d)
- nondeterm member(live_d, live_list_d)
- unique(strings_d)
- append(live_list_d, live_list_d, live_list_d)
- not_member(live_d, live_list_d)
- between_list(live_list_d, live_d, live_d, live_d)
- between_round(live_list_d, live_d, live_d, live_d)
- against(live_list_d, live_d, live_d, live_d)
- nondeterm solution(live_list_d)
- clauses
- unique([]):-!.
- unique([Head|Tail]):-
- member(Head, Tail), !, fail;
- unique(Tail).
- member(Elem, [Elem|_Tail]).
- member(Elem, [_Head|Tail]):-
- member(Elem, Tail).
- append([], List2, List2):-!.
- append([Head|Tail], List2, [Head|TailResult]):-
- append(Tail, List2, TailResult).
- not_member(Elem, List):-
- member(Elem, List), !, fail; !.
- man("Yura").
- man("Tolya").
- man("Alesha").
- man("Kolya").
- man("Vitya").
- city("Moskva").
- city("SP").
- city("Novgorod").
- city("Perm").
- city("Tomsk").
- between_list(List, A, B, C):-
- append(_Left, [A, B, C|_Tail], List), !;
- append(_Left, [C, B, A|_Tail], List).
- between_round(List, A, B, C):-
- between_list(List, A, B, C), !;
- append(Left, [X, Y], List),
- between_list([X, Y|Left], A, B, C).
- against([A, B, C, D, E], A, C, D):-!.
- against([A, B, C, D, E], A, D, C):-!.
- against([A, B, C, D, E], B, D, E):-!.
- against([A, B, C, D, E], B, E, D):-!.
- against([A, B, C, D, E], C, E, A):-!.
- against([A, B, C, D, E], C, A, E):-!.
- against([A, B, C, D, E], D, A, B):-!.
- against([A, B, C, D, E], D, B, A):-!.
- against([A, B, C, D, E], E, B, C):-!.
- against([A, B, C, D, E], E, C, B):-!.
- solution(Solution):-
- man(AM), man(BM), man(CM), man(DM), man(EM),
- city(AC), city(BC), city(CC), city(DC), city(EC),
- Peoples = [AM, BM, CM, DM, EM], unique(Peoples),
- Cities = [AC, BC, CC, DC, EC], unique(Cities),
- Solution = [live(AM, AC), live(BM, BC), live(CM, CC), live(DM, DC), live(EM, EC)],
- between_round(Solution, live(_Tomich, "Tomsk"), live(_Moskvich, "Moskva"), live("Vitya", _VityaCity)),
- between_round(Solution, live("Yura", _YuraCity), live(SPec, "SP"), live("Tolya", _TolyaCity)),
- against(Solution, live(SPec, "SP"), live(_Permyak, "Perm"), live("Alesha", _AleshaCity)),
- not_member(live("Kolya", "SP"), Solution),
- not_member(live("Yura", "Moskva"), Solution), not_member(live("Yura", "Tomsk"), Solution),
- not_member(live("Tolya", "Tomsk"), Solution).
- goal
- solution(Solution).
Решение задачи: «Задача про лагерь Артек и ребят. Переделать решение»
textual
Листинг программы
- domains
- s=symbol
- predicates
- solve(s,s,s,s,s)
- city(s)
- clauses
- city("Moskva").
- city("Sankt_piter").
- city("Novgorod").
- city("Perm").
- city("Tomsk").
- solve(Ura,Vitia,Tolia,Alesha,Kolia):-
- city(Ura),Ura="Novgorod",
- city(Kolia),Ura<>Kolia,Kolia<>"Sankt_piter","Perm"<>"Sankt_piter",
- city(Tolia),Tolia<>Kolia,Tolia<>Ura,Tolia<>"Tomsk",Tolia<>"Sankt_piter",Tolia<>"Perm",
- city(Alesha),Alesha<>Tolia,Alesha<>Kolia,Alesha<>Ura,Alesha<>"Sankt_piter",Alesha<>"Perm",
- city(Vitia),Vitia<>Ura,Vitia<>Kolia,Vitia<>Tolia,Vitia<>Alesha,Vitia<>"Moskva","Moskva"<>"Tomsk".
- goal
- solve(Ura,Vitia,Tolia,Alesha,Kolia).
Объяснение кода листинга программы
В коде на языке Prolog дана задача, связанная с лагерем Артек
и его воспитанниками. В коде определены следующие переменные:
- s - символ
- Ura, Vitia, Tolia, Alesha, Kolia - переменные, представляющие имена воспитанников лагеря Определены следующие предикаты:
- city(s) - предикат, определяющий, является ли символ s названием города
- solve(s,s,s,s,s) - предикат, решающий задачу В коде присутствуют следующие утверждения:
- city(
Moskva
) - Москва является городом - city(
Sankt_piter
) - Санкт-Петербург является городом - city(
Novgorod
) - Новгород является городом - city(
Perm
) - Пермь является городом - city(
Tomsk
) - Томск является городом Также в коде есть цель - решить задачу, то есть найти значения переменных Ura, Vitia, Tolia, Alesha, Kolia, при которых выполняются все условия. Условия задачи, которые заданы в коде, можно разделить на следующие группы: - Условие на город Ura и Kolia:
- Ura=
Novgorod
- Ura<>Kolia
Perm
<>Kolia
- Ura=
- Условие на город Tolia и Kolia:
- city(Tolia)
- Tolia<>Kolia
- Tolia<>Ura
- Tolia<>
Tomsk
- Tolia<>
Sankt_piter
- Tolia<>
Perm
- Условие на город Alesha и Kolia:
- city(Alesha)
- Alesha<>Tolia
- Alesha<>Kolia
- Alesha<>Ura
- Alesha<>
Sankt_piter
- Alesha<>
Perm
- Условие на город Vitia и Kolia:
- city(Vitia)
- Vitia<>Ura
- Vitia<>Kolia
- Vitia<>Tolia
- Vitia<>Alesha
- Vitia<>
Moskva
- Vitia<>
Tomsk
Таким образом, в коде дана система уравнений, которую нужно решить, чтобы найти значения переменных Ura, Vitia, Tolia, Alesha, Kolia, при которых все условия выполняются.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д