Для первого выпуска вам нужно правило с переменными.Словами вы можете указать правило, например
Если X имеет тип T, а вещи типа T имеют высоту H, то X имеет высоту H.
в этом случае
Если Марк - отец, а у отца рост 195, тогда Марк имеет рост 195.
В прологе:
height(X,H) :- isa(X,T), height(T,H).
Для второго выпуска вынужно рекурсивное правило.Иными словами:
Если X имеет тип T, а вещи типа T имеют элемент E, то X имеет элемент E.
Перефразировано:
X имеет элемент E, если X имеет тип T, а вещь типа T имеет элемент E.
Из второго утверждения видно, что правило для имеет элемент содержится в определении.Это рекурсия, и она позволяет правилу автоматически расширяться на несколько уровней.В текущем примере первое раскрытие будет иметь вид:
X имеет элемент E, если X имеет тип T, а объект типа T имеет тип Z, а объект типа Z имеет элемент E.
В этом примере это будет:
X имеет тело, если X - отец, а отец - мужчина, а мужчина - тело .
Это расширение может продолжаться до тех пор, пока существует isa
операторов с доступными правильными значениями (в этом случае нам нужно еще одно расширение).Последнее расширение не использует правило, но соответствует простому факту (в данном случае hasa(person,body)
).В прологе:
hasa(X,E) :- isa(X,Z), hasa(Z,E).
Полный пример:
% isa: general facts
isa(father,man).
isa(man,person).
% isa: specific facts
isa(mark,father).
% height: general facts
height(father,195).
% height: rules
height(X,H) :- isa(X,T), height(T,H).
% hasa: general facts
hasa(person,body).
% hasa: rules
hasa(X,E) :- isa(X,Z), hasa(Z,E).
Запросы:
?- height(mark,Height).
Height = 195 .
?- hasa(mark,X).
X = body .