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

Узнай цену своей работы

Формулировка задачи:

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

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

textual
Листинг программы
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).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.455 из 5