Пролог - Как переписать факты в семантической сети? - PullRequest
1 голос
/ 17 марта 2019

У меня есть семантическая сеть со следующей иерархией:

Person: has body = true
Man: is a Person, height = 170
Sport Star: is a Man, height = 190

Затем я хочу создать их экземпляры, такие как:

Mark: is a Sport Star

Однако, когда я звоню, например, height(Mark, X), я получаю X = 170, и мне нужно нажать ;, чтобы получить X = 190. Есть ли способ просто получить 190 сразу?

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

SWI-Prolog, который вы указали, использует расширенную поддержку технологий семантической паутины. Но если ваша семантическая сеть состоит только из is-a иерархических отношений, вы также можете легко выразить их с помощью Logtalk, которую вы можете запустить с SWI-Prolog и большинством систем Prolog, что делает его широко портативный:

% Person: has body = true
:- object(person).

    :- public(has/1).
    has(body).

:- end_object.

% Man: is a Person, default height = 170
:- object(man, extends(person)).

    :- public(height/1).
    height(170).

:- end_object.

% Sport Star: is a Man, default height = 190
:- object(sport_star, extends(man)).

    % override inherited height
    height(190).

:- end_object.

% Mark: is a Sport Star
:- object(mark, extends(sport_star)).

:- end_object.

% Spencer: is another Sport Star, but slim
:- object(spencer, extends(sport_star)).

    % override inherited height
    height(165).

:- end_object.

В этом решении используется иерархия прототипов . Примеры вызовов (детерминированные; нет ложных точек выбора):

?- mark::height(Height).
Height = 190.

?- mark::has(What).
What = body.

?- spencer::height(Height).
Height = 165.

Вы можете создать столько прототипов, сколько вам нужно, либо они определены в исходном файле, либо созданы динамически во время выполнения. Э.Г.

?- create_object(alan, [extends(man)], [], []).
true.

?- alan::height(Height).
Height = 170.

Также возможно использовать классы вместо прототипов, если вам необходимо различать абстракции и конкретные примеры этих абстракций.

0 голосов
/ 02 апреля 2019

Ответ Пауло Моуры является хорошим примером возможностей расширений и библиотек 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.
...