Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Prolog > Кто является австралийцем? Каким спортом увлекаетс


Автор: Линус 8.12.2014, 18:41
Здравствуйте, помогите пожалуйста решить задачи по SWI Prolog с пояснением.
Три друга заняли первое, второе, третье места в соревнованиях универсиады. Друзья разной национальности, зовут их по-разному, и любят они разные виды спорта. Майкл предпочитает баскетбол и играет лучше, чем американец. Израильтянин Саймон играет лучше теннисиста. Игрок в крикет занял первое место. Кто является австралийцем? Каким спортом увлекается Ричард?
Я решила, но что то не работает
nation(austrian).
nation(american).
nation(istreali).
sport(basketball).
sport(tennis).
sport(criket).
name(milk).
name(saimon).
name(richard).
prize(1).
prize(2).
prize(3).
soot(N,Nat,S,M):-nation(Nat),sport(S),name(N),prize(M),N=milk,S=basketball, not(Nat=american),not(M=1), not(M=3).
soot(N,Nat,S,M):-nation(Nat),sport(S),name(N),prize(M),N=saimon, not(S=tennis),Nat=istreali,not(M=3).
soot(N,Nat,S,M):-nation(Nat),sport(S),name(N),prize(M),N=richard, not(S=basketball),not(Nat=istreali).

Автор: rrrFer 9.12.2014, 12:40
Вот тут твоя задача разобарна по полочкам, даже с иллюстрациями: http://pro-prof.com/archives/1299

Код

nation(austrian).
nation(american).
nation(israeli).
 
sport(basketball).
sport(tennis).
sport(cricket).
 
name(mikl).
name(saimon).
name(richard).
 
prize(1).
prize(2).
prize(3).

solve(Mans):-
  Mans = [man(X, XNat, XSp, XP), man(Y, YNat, YSp, YP), man(Z, ZNat, ZSp, ZP)],
 
  name(X), name(Y), name(Z), unique([X, Y, Z]),
  nation(XNat), nation(YNat), nation(ZNat), unique([XNat, YNat, ZNat]),
  sport(XSp), sport(YSp), sport(ZSp), unique([XSp, YSp, ZSp]),
  prize(XP), prize(YP), prize(ZP), unique([XP, YP, ZP]),
 
  % Майкл играет в баскетбол
  member(man(mikl, _, basketball, MiklPos), Mans),
 
  % Майкл играет лучше чем американец
  member(man(_, american, _, AmerPos), Mans), MiklPos < AmerPos,
 
  % Саймон - израильтянин
  member(man(saimon, israeli, _, SaimonPos), Mans),
 
  % Саймон играет лучше теннисиста
  member(man(_, _, tennis, TennPos), Mans), SaimonPos < TennPos,
 
  % игрок в крикет занят первое место
  member(man(_, _, cricket, 1), Mans).
 
start(Solve):-
  solve(Solve), Solve = [man(_, _, _, 1), man(_, _, _, 2), man(_, _, _, 3)].


Код взял из статьи, пояснения компипастить не стал.
Предикат unique проверяет чтобы элементы списка не повторялись (по ссылке его тоже можно найти где-то)

Автор: Линус 18.12.2014, 21:47
Спасибо)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)