如何在 SWI-Prolog 中表示 semnet
How to represent semnet in SWI-Prolog
我正在尝试创建一个看起来有点像这样的语义网络:。
至此我只是设置了基本事实,例如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
.
对于第一期,您需要一个带有变量的规则。用文字你可以指定规则,如
如果X是T类型,T类型的东西高度为H,那么X的高度为H。
在这种情况下
如果马克是父亲,父亲身高195,那么马克身高195。
序言中:
height(X,H) :- isa(X,T), height(T,H).
对于第二个问题,您需要一个递归规则。言外之意:
如果 X 是类型 T 并且类型 T 的东西有元素 E 那么 X 有元素 E.
改写:
如果 X 是类型 T 并且类型 T 的事物具有元素 E,则 X 具有元素 E。
从第二条语句可以看出,has element 的规则在定义中包含了自身。这就是递归,它允许规则自动扩展到多个级别。在当前示例中,第一个扩展将是:
X 有元素 E 如果 X 是类型 T 并且类型 T 的东西是类型 Z 并且类型 Z 的东西有元素 E.
在示例中,这将是:
X 有 body 如果 X 是父亲,父亲是男人,男人有 body。
只要有 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 .
我正在尝试创建一个看起来有点像这样的语义网络:
至此我只是设置了基本事实,例如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
.
对于第一期,您需要一个带有变量的规则。用文字你可以指定规则,如
如果X是T类型,T类型的东西高度为H,那么X的高度为H。
在这种情况下
如果马克是父亲,父亲身高195,那么马克身高195。
序言中:
height(X,H) :- isa(X,T), height(T,H).
对于第二个问题,您需要一个递归规则。言外之意:
如果 X 是类型 T 并且类型 T 的东西有元素 E 那么 X 有元素 E.
改写:
如果 X 是类型 T 并且类型 T 的事物具有元素 E,则 X 具有元素 E。
从第二条语句可以看出,has element 的规则在定义中包含了自身。这就是递归,它允许规则自动扩展到多个级别。在当前示例中,第一个扩展将是:
X 有元素 E 如果 X 是类型 T 并且类型 T 的东西是类型 Z 并且类型 Z 的东西有元素 E.
在示例中,这将是:
X 有 body 如果 X 是父亲,父亲是男人,男人有 body。
只要有 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 .