Задача о любви без взаимности - Prolog
Формулировка задачи:
Задача о любви без взаимности
помогите начинающему чем сможете. И да, если можно, не меняйте сильно метод и структуру.
Листинг программы
- %Про любовь без взаимности
- %
- %Трое юношей: Коля, Петя и Юра - влюблены в трех девушек: Таню, Зину и Галю. Но это любовь без взаимности.
- %1. Коля любит девушку, влюбленную в юношу, который любит Таню.
- %2. Петя любит девушку, влюбленную в юношу, который любит Зину.
- %3. Зина не любит Юру.
- %
- %Кто в кого влюблен?
- DOMAINS
- человек = symbol
- PREDICATES
- nondeterm имя_юноши(человек)
- nondeterm имя_девушки(человек)
- nondeterm любит(человек,человек)
- nondeterm ищем_решение(человек,человек,человек,человек,человек,человек)
- CLAUSES
- % перечисляем имена
- имя_юноши("коля").
- имя_юноши("петя").
- имя_юноши("юра").
- имя_девушки("таня").
- имя_девушки("зина").
- имя_девушки("галя").
- %ограничение любви без взаимности
- любит(Юноша,Девушка):-
- имя_юноши(Юноша),имя_девушки(Девушка),not(любит(Девушка,Юноша)).
- любит(Девушка,Юноша):-
- имя_девушки(Девушка),имя_юноши(Юноша),not(любит(Юноша,Девушка)).
- %условия задачи
- любит("коля",Девушка):-
- любит(Девушка,Юноша),любит(Юноша,"таня").
- любит("петя",Девушка):-
- любит(Девушка,Юноша),любит(Юноша,"зина").
- любит("зина",Юноша):-
- not(Юноша = "юра").
- %формирование гипотезы
- ищем_решение(Имя1,Имя2,Имя3,Имя4,Имя5,Имя6):-
- имя_юноши(Имя1),
- имя_юноши(Имя2),not(Имя2=Имя1),
- имя_юноши(Имя3),not(Имя3=Имя1),not(Имя3=Имя2),
- имя_девушки(Имя4),
- имя_девушки(Имя5),not(Имя5=Имя4),
- имя_девушки(Имя6),not(Имя6=Имя4),not(Имя6=Имя5),
- любит(Имя1,Имя2),
- любит(Имя2,Имя3),
- любит(Имя3,Имя4),
- любит(Имя4,Имя5),
- любит(Имя5,Имя6),
- любит(Имя6,Имя1).
- GOAL
- ищем_решение(Имя1,Имя2,Имя3,Имя4,Имя5,Имя6).
Решение задачи: «Задача о любви без взаимности»
textual
Листинг программы
- PREDICATES
- male(string) /*Парни*/
- female(string) /*Девушки*/
- love(string,string)
- sol(string, string, string, string, string, string) /*решение*/
- print.
- CLAUSES
- /*заполняем людей*/
- male("Kolya").
- male("Dima").
- male("Yura").
- female("Anya").
- female("Lena").
- female("Vika").
- love(X, Y):- male(X), female(Y).
- love(Y, X):- male(X), female(Y).
- love("Kolya", Y):-love(Y, X), love(X, "Lena").
- love("Dima", Y):-love(Y, X), love(X, "Vika").
- love("Lena", X):- male(X), not (X="Yura").
- sol(X1, X2, X3, Y1, Y2, Y3):-
- male(X1), male(X2), male(X3),
- female(Y1), female(Y2), female(Y3),
- love(X1, Y1),
- not(love(Y1,X1)),
- love(X2, Y2),
- not(love(Y2,X2)),
- love(X3, Y3),
- not(love(Y3,X3)),
- /*Каждый человек должен быть только один раз*/
- X1<>X2,
- X1<>X3,
- X2<>X3,
- Y1<>Y2,
- Y1<>Y3,
- Y2<>Y3.
- /*Печать результатов.*/
- print:- sol(X1, X2, X3, Y1, Y2, Y3),
- write(X1, " - ", Y1, ". ",
- X2, " - ", Y2, ". ",
- X3, " - ", Y3, ". ").
Объяснение кода листинга программы
- Создаются шесть человек: Коля, Дима, Юра, Аня, Лена, Вика.
- Задаются три пары людей, которые любят друг друга: Коля любит Лену, Дима любит Вику, а Лена любит Юру.
- Три пары людей, которые не любят друг друга: Коля не любит Диму, Дима не любит Колю, а Юра не любит Лену.
- Оформляется факт того, что каждый человек должен быть только один раз: Коля не может быть Димой или Юрой, Дима не может быть Колей или Юрой, а Юра не может быть Колей или Димой.
- Аналогично оформляется факт того, что каждая девушка должна быть только один раз: Аня не может быть Леней или Викой, Лена не может быть Аней или Викой, а Вика не может быть Аней или Леной.
- Формулируется основная задача: нахождение шести пар людей, которые любят друг друга.
- Для решения этой задачи используется метод перебора всех возможных комбинаций пар людей и проверки условий, что они любят друг друга, а их имена не совпадают.
- Если найдена пара людей, удовлетворяющая всем условиям, то она выводится на экран.
- Если не найдено ни одной пары людей, удовлетворяющей всем условиям, то выводится сообщение об этом.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д