Я работаю над Семью языками за семь недель, но кое-что не понимаю в прологе. У меня есть следующая программа (на основе их программы Уоллеса и Громмита):
/* teams.pl */
onTeam(a, aTeam).
onTeam(b, aTeam).
onTeam(b, superTeam).
onTeam(c, superTeam).
teamMate(X, Y) :- \+(X = Y), onTeam(X, Z), onTeam(Y, Z).
и загрузить его так
?- ['teams.pl'].
true.
но это не дает мне никаких решений для следующего
?- teamMate(a, X).
false.
он может решать более простые вещи (что показано в книге):
?- onTeam(b, X).
X = aTeam ;
X = superTeam.
и есть решения:
?- teamMate(a, b).
true ;
false.
Что мне не хватает? Я пробовал как с gnu prolog, так и с swipl.
...И ЕЩЁ ЕЩЕ...
когда вы переместите ограничение «не может быть своим товарищем по команде», чтобы закончить:
/* teams.pl */
onTeam(a, aTeam).
onTeam(b, aTeam).
onTeam(b, superTeam).
onTeam(c, superTeam).
teamMate(X, Y) :- onTeam(X, Z), onTeam(Y, Z), \+(X = Y).
это дает мне решения, которые я ожидал:
?- ['teams.pl'].
true.
?- teamMate(a, X).
X = b.
?- teamMate(b, X).
X = a ;
X = c.
Что дает?