4

Задача:

  • Три друга – Петр, Роман и Сергей учатся на математическом, физическом и химическом факультетах университета.
  • Если Петр математик, то Сергей не физик.
  • Если Роман не физик, то Петр – математик.
  • Если Сергей не математик, то Роман – химик.

Определите специальность Сергея.

Код:

domains
    dep=symbol
predicates
    faculty(dep)
    cond1(dep, dep)
    cond2(dep, dep)
    cond3(dep, dep)
    solve(dep, dep, dep) % Peter, Roman, Sergey
clauses
    faculty(physics).
    faculty(math).
    faculty(chemistry).

    cond1(Fa1, Fa3):-
        Fa1=math,
        Fa3<>physics.

    cond2(Fa2, Fa1):-
        Fa2<>physics,
        Fa1=math.

    cond3(Fa3, Fa2):-
        Fa3<>math,
        Fa2=chemistry.

    solve(Fa1, Fa2, Fa3):-
        faculty(Fa1),
        faculty(Fa2),
        faculty(Fa3),
        Fa1<>Fa2,
        Fa2<>Fa3,
        Fa1<>Fa3,
        cond1(Fa1, Fa3);
        cond2(Fa2, Fa1);
        cond3(Fa3, Fa2).

При запуске данного кода выскакивает следующая ошибка:

введите сюда описание изображения

Как можно исправить данную ошибку и есть ли у этой задачки какое-либо другое решение на прологе?
Ответ у задачки должен быть такой: Петр - химик, Роман - физик, Сергей - математик

Sublihim
  • 2,289
ivnku
  • 177

1 Answers1

2

Используй вместо <> конструкцию not(a=b).

domains
     dep=symbol
 predicates
    faculty(dep)
    cond1(dep, dep)
    cond2(dep, dep)
    cond3(dep, dep)
   solve(dep, dep, dep) % Peter, Roman, Sergey
clauses
    faculty(physics).
    faculty(math).
    faculty(chemistry).


cond1(Fa1, Fa2):-
    Fa1=math,
    not(Fa2=physics).
cond1(Fa1, _):-
    not(Fa1=math).

cond2(Fa1, Fa2):-
    not(Fa1=physics),
    Fa2=math.
cond2(physics, _).

cond3(Fa1, Fa2):-
    not(Fa1=math),
    Fa2=chemistry.
cond3(math, _). 

solve(Fa1, Fa2, Fa3):-
    faculty(Fa1),
    faculty(Fa2),
    faculty(Fa3),
    Fa1<>Fa2,
    Fa2<>Fa3,
    Fa1<>Fa3,
    cond1(Fa1, Fa3),
    cond2(Fa2, Fa1),
    cond3(Fa3, Fa2).
goal
    solve(Fa1, Fa2, Fa3),
    write(Fa1),nl,
    write(Fa2),nl,
    write(Fa3).
  • спасибо большое. А зачем после каждого правила мы еще вставляем предикат с тем же именем? – ivnku Jan 17 '17 at 18:15
  • Для обработки ситуации, когда условие не выполняется: например если Петр не математик, то Сергей возможно и физик. Пролог при переборе учтет такие ситуации. – Oleg Brezhnev Jan 17 '17 at 20:47