Ответ в теме: Влюбленные юноши и девушки (Turbo и SWI Prolog)

      Комментарии к записи Ответ в теме: Влюбленные юноши и девушки (Turbo и SWI Prolog) отключены
#2421

Вы не оформили исходный в соответствии с соглашением о кодировании, поэтому Ваш код тяжело читать (все эти переменные X1, Y1, … мало о чем мне говорят). Поэтому я напишу новый код на SWI-Prolog, а Вы уже самостоятельно перепишите его на Turbo Prolog (по возможности результат выложите на форум).

Не понятен вопрос в задаче, т.е. что именно требуется решить или доказать? — догадываюсь, что надо выяснить кто кого любит. Тогда нам для начала надо задать информацию о мальчиках и девочках при помощи фактов пролога:

male(kolya).
male(dima).
male(yura).
female(anya).
female(lena).
female(vika).

Затем, мы можем попросить пролог найти все возможные сочетания пар, при этом сразу зададим 6 пар, в каждой из которых будет лишь одна переменная:

solve_love_problem(Solution):-
% решение должно представлять собой шесть пар, показывающих кто кого любит
Solution = [
love(kolya, KolyaGirl),
love(dima, DimaGirl),
love(yura, YuraGirl),
love(anya, AnyaBoy),
love(lena, LenaBoy),
love(vika, VikaBoy)
],
% генерация всех возможных вариантов
female(KolyaGirl), female(DimaGirl), female(YuraGirl),
male(AnyaBoy), male(LenaBoy), male(VikaBoy).

Если мы запустим такой код, то на экране получим следующее (приведен фрагмент):

?- solve_love_problem(X).
X = [love(kolya, anya), love(dima, anya), love(yura, anya), love(anya, kolya), love(lena, kolya), love(vika, kolya)] ;
X = [love(kolya, anya), love(dima, anya), love(yura, anya), love(anya, kolya), love(lena, kolya), love(vika, dima)] ;
X = [love(kolya, anya), love(dima, anya), love(yura, anya), love(anya, kolya), love(lena, kolya), love(vika, yura)] ;

В первой строке видно, что пролог перебирает вариант, когда все мальчики любят Аню и считает его верным (ведь мы еще не задали никаких ограничений). В коде программы который вы приводили исключались повторы имен, я делаю это с помощью функции unique, для этого после генерации вариантов надо добавить следующее:

Girls = [KolyaGirl, DimaGirl, YuraGirl],
Boys = [AnyaBoy, LenaBoy, VikaBoy],
unique(Girls), unique(Boys).

Мы помещаем все переменные, соответствующие девушкам и юношам в списки и требуем уникальность их элементов. Теперь после запуска программы мы увидим, что все переменные в решении инициализированы уникальным именем (приведен фрагмент):

?- solve_love_problem(X).
X = [love(kolya, anya), love(dima, lena), love(yura, vika), love(anya, kolya), love(lena, dima), love(vika, yura)] ;
X = [love(kolya, anya), love(dima, lena), love(yura, vika), love(anya, kolya), love(lena, yura), love(vika, dima)] ;