Ответ Пауло Моуры является хорошим примером возможностей расширений и библиотек Prolog.Если вы создаете реальное приложение, тогда лучше использовать что-то подобное.Однако, если вы изучаете Пролог и хотите знать, как он работает, здесь приведен дополнительный чистый ответ Пролога.
Наблюдаемое вами поведение согласуется с вашей базой знаний, что допускает две возможные интерпретации: Маркчеловек и, следовательно, его рост 170, или Марк спортсмен, и, следовательно, его рост 195. Оба являются действительными производными, которые поддерживаются базой знаний, поэтому Пролог возвращает каждое из них по очереди.
Вы можете навязатьдополнительные ограничения в правилах, чтобы остановить деривацию, как только обнаружится первый факт.Правило тогда формулируется как «высота X является либо базовым фактом для вещей типа X, либо , если базового факта нет , следуйте соотношению isa и повторите попытку».Это требует, чтобы базовые факты получили другое имя, чем правило. часть не может быть представлена с помощью оператора отрицания \+
.
Код:
% isa: general facts
isa(father,man).
isa(man,person).
% isa: specific facts
isa(mark,sportsman).
% height: general facts
height_base(person,170).
height_base(sportsman,195).
% height: rules
height(X,H) :- height_base(X,H).
height(X,H) :- \+height_base(X,_), isa(X,T), height(T,H).
Запросы:
?- height(man,X).
X = 170 ;
false.
?- height(mark,X).
X = 195 ;
false.
?- height(sportsman,X).
X = 195 ;
false.
?- height(person,X).
X = 170 ;
false.