我在 Prolog 中使用继承的覆盖继承了错误的 属性 ?为什么?
My override using inheritance in Prolog is inheriting the wrong property ? why?
我正在尝试使用以下规则覆盖颜色属性:-
prop(color, bmw, yellow).
prop(color, audi, red).
maps(mycar, subset, bmw).
maps(hiscar, isa, audi).
%Rules
hasproperty(Property, Object, Value) :-
maps(Property, Object, Value).
hasproperty(Property, Object, Value) :-
maps(Object, subset, Parent);
hasproperty(Property, Parent, Value),
maps(Property, Ojbect, _).
hasproperty(Property, Object, Value) :-
maps(Object, isa, Parent),
hasproperty(Property, Parent, Value),
maps(Property, Ojbect, _).
但是我得到了一个错误的值,它应该作为红色继承,但我却变成了黄色,为什么会这样?
17 ?- hasproperty(color, hiscolor, Z).
Z = yellow.
应该是Z=红色
您的程序有很多错误,您应该在将文件加载到 prolog 后阅读警告。
- 为什么要在
hasproperty
谓词的第二个子句中使用 ;
?
- 您在最后两个子句中将
Object
拼写为 Ojbect
。
- 你为什么要在最后两个子句中声明
property(Property, Ojbect, _)
?
- 除非你有很好的理由,否则你应该在一个地方定义谓词的所有子句。不要像那样穿插
rel
和 property
。如果你有充分的理由这样做,你必须使用 discontiguous
来声明它们。
Prolog 应该警告您有关 2 和 4 的信息。
在线加载SWISH中的代码,点击行号左侧设置跟踪点(红点),然后提交查询。您可以逐步执行代码,看看发生了什么。
它在 qe2 上寻找轮子,并找到 none。
然后它会寻找 qe2 作为任何东西的子集,不。
然后它寻找任何带轮子的东西,发现 land
有 4 个轮子 (??)。
然后它会寻找任何带轮子的东西(因为 Ojbect 的错别字,它不会寻找 qe2 - 谢谢 rajashekar!我不知道为什么它表现得很奇怪)。
发现陆地有4个轮子,并且存在有轮子的东西,所以成为第一个答案。
您的代码:
hasproperty(Property, Object, Value) :-
rel(Object, subset, Parent);
hasproperty(Property, Parent, Value), <----- wheels, land, 4
property(Property, Ojbect, _). <--typo Ojbect
所以 4 来自陆地。
我正在尝试使用以下规则覆盖颜色属性:-
prop(color, bmw, yellow).
prop(color, audi, red).
maps(mycar, subset, bmw).
maps(hiscar, isa, audi).
%Rules
hasproperty(Property, Object, Value) :-
maps(Property, Object, Value).
hasproperty(Property, Object, Value) :-
maps(Object, subset, Parent);
hasproperty(Property, Parent, Value),
maps(Property, Ojbect, _).
hasproperty(Property, Object, Value) :-
maps(Object, isa, Parent),
hasproperty(Property, Parent, Value),
maps(Property, Ojbect, _).
但是我得到了一个错误的值,它应该作为红色继承,但我却变成了黄色,为什么会这样?
17 ?- hasproperty(color, hiscolor, Z).
Z = yellow.
应该是Z=红色
您的程序有很多错误,您应该在将文件加载到 prolog 后阅读警告。
- 为什么要在
hasproperty
谓词的第二个子句中使用;
? - 您在最后两个子句中将
Object
拼写为Ojbect
。 - 你为什么要在最后两个子句中声明
property(Property, Ojbect, _)
? - 除非你有很好的理由,否则你应该在一个地方定义谓词的所有子句。不要像那样穿插
rel
和property
。如果你有充分的理由这样做,你必须使用discontiguous
来声明它们。
Prolog 应该警告您有关 2 和 4 的信息。
在线加载SWISH中的代码,点击行号左侧设置跟踪点(红点),然后提交查询。您可以逐步执行代码,看看发生了什么。
它在 qe2 上寻找轮子,并找到 none。
然后它会寻找 qe2 作为任何东西的子集,不。
然后它寻找任何带轮子的东西,发现 land
有 4 个轮子 (??)。
然后它会寻找任何带轮子的东西(因为 Ojbect 的错别字,它不会寻找 qe2 - 谢谢 rajashekar!我不知道为什么它表现得很奇怪)。
发现陆地有4个轮子,并且存在有轮子的东西,所以成为第一个答案。
您的代码:
hasproperty(Property, Object, Value) :-
rel(Object, subset, Parent);
hasproperty(Property, Parent, Value), <----- wheels, land, 4
property(Property, Ojbect, _). <--typo Ojbect
所以 4 来自陆地。