Новичок: невозможно отследить свободную переменную в выражении ошибки. Пролог Программирование
Просто начал программировать на Прологе. Я написал пару статей.
predicates
parent(symbol,symbol)
male(symbol)
female(symbol)
mother(symbol,symbol)
father(symbol,symbol)
brother(symbol,symbol)
sister(symbol,symbol)
uncle(symbol,symbol)
clauses
parent(arthur,fred).
parent(arthur,george).
parent(arthur,bill).
parent(arthur,percy).
parent(arthur,ginny).
parent(arthur,ron).
parent(arthur,charlie).
parent(molly,fred).
parent(molly,george).
parent(molly,bill).
parent(molly,percy).
parent(molly,ginny).
parent(molly,ron).
parent(molly,charlie).
parent(rowling,arthur).
parent(rowling,james).
parent(james,harry).
parent(lily,harry).
female(molly).
female(ginny).
female(lily).
female(rowling).
male(X) if not(female(X)).
brother(X,Y) if male(Y),X<>Y,brother(Y,X).
brother(X,Y) if X<>Y,parent(Z,X),parent(Z,Y),male(X).
mother(X,Y) if parent(X,Y),female(X).
father(X,Y) if parent(X,Y),male(X).
sister(X,Y) if parent(Z,X),parent(Z,Y),female(X),X<>Y.
uncle(X,Y) if parent(Z,Y),brother(X,Z).
Но когда я пытаюсь задать вопрос
brother(X,james)
Это показывает Свободную переменную в выражении в X<> Y в строке
brother(X,Y) if male(Y),X<>Y,brother(Y,X).
Я не могу отследить, в чем проблема с кодом
1 ответ
Решение
Может быть, вы могли бы попытаться упростить правило
brother(X,Y) if male(Y),X<>Y,parent(Z,X),parent(Z,Y).
но это не сработает, потому что мужской /2 это определяется только в отрицательных терминах. Чтобы это работало, я бы добавил:
person(X) :- parent(X,_) ; parent(_,X).
male(X) :- person(X), not(female(X)).
Теперь мужчина /1 способен генерировать позитивную информацию...
(примечание: непроверенный код)
редактировать лучше, без добавления человека /1, может быть
/* Y is brother of X */
brother(X,Y) if parent(Z,X), parent(Z,Y), X<>Y, male(Y).