#prolog #semantic-web
#пролог #семантическая сеть
Вопрос:
Я пытаюсь создать семантическую сеть, которая выглядит примерно так: .
Пока я только изложил основные факты, такие как isa(man,person)
или hasa(person,node)
.
Если я создаю экземпляры Person, такие как isa(mark,father)
и затем просматриваю height(mark,Height)
, я получаю false. Я понимаю, что мне нужно каким-то образом доработать определение для height(Person,Height)
, а также isa(X,Y)
и hasa(X,Y)
, но я не уверен, как это сделать.
Чего бы я хотел, так это иметь возможность искать, например, height(mark,Height)
и получать 195
, или hasa(mark,X)
и получать body
.
Ответ №1:
Для первого вопроса вам понадобится правило с переменными. В словах вы можете указать правило, подобное
Если X имеет тип T, а объекты типа T имеют высоту H, то X имеет высоту H.
в этом случае
Если марк является отцом, а отцы имеют высоту 195, то марк имеет высоту 195.
В Prolog:
height(X,H) :- isa(X,T), height(T,H).
Для второго вопроса вам нужно рекурсивное правило. Словами:
Если X имеет тип T, а объекты типа T имеют элемент E, то X имеет элемент E.
Перефразировано:
X имеет элемент E, если X имеет тип T, а объект типа T имеет элемент E.
Из второго утверждения видно, что правило для элемента has само содержится в определении. Это рекурсия, и она позволяет правилу автоматически расширяться на несколько уровней. В текущем примере первым расширением будет:
X имеет элемент E, если X имеет тип T, а объект типа T имеет тип Z, а объект типа Z имеет элемент E.
В примере это было бы:
У X есть тело, если X — отец, а отец — мужчина, а у мужчины есть тело.
Это расширение может продолжаться до тех пор, пока доступны isa
инструкции с правильными значениями (в этом случае нам нужно еще одно расширение). Последнее расширение не использует правило, но соответствует простому факту (в данном случае hasa(person,body)
). В prolog:
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 .