Как представить semnet в SWI-Prolog

#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 .