Как представить семнет в SWI-Прологе - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь создать семантическую сеть, которая выглядит примерно так: this.

Пока я только что установил основные факты, такие как 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 Ответ

2 голосов
/ 27 марта 2019

Для первого выпуска вам нужно правило с переменными.Словами вы можете указать правило, например

Если 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 .
...