#inheritance #prolog #overriding
Вопрос:
Я пытаюсь переопределить свойства цвета, используя приведенные ниже правила :-
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= красный
Ответ №1:
В вашей программе много ошибок, вы должны прочитать предупреждения после загрузки файла в prolog.
- Почему вы используете
;
во втором предложенииhasproperty
предикат? - Вы написали
Object
так, какOjbect
в двух последних пунктах. - Почему вы
property(Property, Ojbect, _)
вообще утверждаете в последних двух пунктах? - Если у вас нет очень веской причины, вы должны определить все предложения предиката в одном месте. Не перемежайте
rel
иproperty
тому подобное. И если у вас есть веская причина для этого, вы должны использоватьdiscontiguous
ее, чтобы объявить их таковыми.
Пролог должен был предупредить вас о 2 и 4.
Ответ №2:
Загрузите свой код в SWISH online и нажмите слева от номеров строк, чтобы установить точки трассировки (красные точки), а затем отправьте свой запрос. Вы можете шаг за шагом просматривать код и видеть, что происходит.
Он ищет колеса на qe2 и не находит ни одного.
Затем он ищет qe2 как подмножество чего угодно, нет.
Затем он ищет что-нибудь с колесами и находит land
, что у него 4 колеса (??).
Затем он ищет что — нибудь с колесами (из-за опечатки Ojbect он не ищет qe2- спасибо раджашекару! Я был в тупике, почему это вело себя странно).
Он обнаружил, что земля имеет 4 колеса, и существует что-то с колесами, так что это становится первым ответом.
Ваш код здесь:
hasproperty(Property, Object, Value) :-
rel(Object, subset, Parent);
hasproperty(Property, Parent, Value), <----- wheels, land, 4
property(Property, Ojbect, _). <--typo Ojbect
Итак, 4 приходит с суши.