Здравствуйте, igna, Вы писали:
I>Верно ли следующее?:
I>Если классы B и D связаны отношением D Is-a B; то любое утверждение истинное для B, является истинным для D.
Насколько я понимаю, нет.
What a piece of work is a man! how noble in reason! how infinite in faculty! in form and moving how express and admirable! in action how like an angel! in apprehension how like a god! the beauty of the world! the paragon of animals!
Здравствуйте, igna, Вы писали:
I>Верно ли следующее?:
I>Если классы B и D связаны отношением D Is-a B; то любое утверждение истинное для B, является истинным для D.
Что понимается под термином класс? Это понятие, имхо, не поддается универсальной формализации, оставаясь специфичным для каждой группы языков.
Если говорить о типах, а тип в свою очередь рассматривать как множество объектов, обладающих определенными свойствами, то да. В нотации теории множеств:
B ={x | PB(x)}
D ={x | PD(x) /\ PB(x)}
Подразумевается, что x берутся из большого универсума, и PB(x), PD(x) — предикаты над элементами универсума. Чтобы D было подмножеством (subtype) B необходимо, чтобы для любого его элемента выполнялся предикат PB(x).
Здравствуйте, igna, Вы писали:
I>Здравствуйте, D. Mon, Вы писали:
DM>>http://en.wikipedia.org/wiki/Liskov_substitution_principle
I>Это да или нет?
Это ни то ни другое. Могут быть утверждения истинные для B но ложные для D но при этом LSP строго соблюдается.
Здравствуйте, igna, Вы писали:
GIV>>Это ни то ни другое. Могут быть утверждения истинные для B но ложные для D но при этом LSP строго соблюдается.
I>Спасибо, только это и есть "нет".
Нет это не есть "нет" как ответ на изначальный вопрос
Ответ "нет" тут на утверждение:
Если классы B и D связаны отношением D подкласс B и соблюдается LSP; то любое утверждение истинное для B, является истинным для D.
А это таки другой вопрос
Интуитвно понятно, что и на оригинальный вопрос ответ "нет" но формального доказательства я не могу привести
Здравствуйте, igna, Вы писали:
I>Верно ли следующее?: I>Если классы B и D связаны отношением D Is-a B; то любое утверждение истинное для B, является истинным для D.
Неверно, утверждение «x is not D» в общем случае не удовлетворяет условию.
Здравствуйте, deniok, Вы писали:
D>Здравствуйте, igna, Вы писали:
I>>Верно ли следующее?:
I>>Если классы B и D связаны отношением D Is-a B; то любое утверждение истинное для B, является истинным для D.
D>Что понимается под термином класс? Это понятие, имхо, не поддается универсальной формализации, оставаясь специфичным для каждой группы языков.
D>Если говорить о типах, а тип в свою очередь рассматривать как множество объектов, обладающих определенными свойствами, то да. В нотации теории множеств: D>
D>B ={x | PB(x)}
D>D ={x | PD(x) /\ PB(x)}
D>
D>Подразумевается, что x берутся из большого универсума, и PB(x), PD(x) — предикаты над элементами универсума. Чтобы D было подмножеством (subtype) B необходимо, чтобы для любого его элемента выполнялся предикат PB(x).
Подмножество и подтип не тождественные понятия.
Простой пример: квадрат является подмножеством прямоугольника но не являеться его подтипом.
Или например в С/С++ типы short и long.
Здравствуйте, Кодёнок, Вы писали:
Кё>Здравствуйте, igna, Вы писали:
I>>Верно ли следующее?: I>>Если классы B и D связаны отношением D Is-a B; то любое утверждение истинное для B, является истинным для D.
Кё>Неверно, утверждение «x is not D» в общем случае не удовлетворяет условию.
Ваше утверждение не удовлетворяет условию см. выделенное
Вы доказываете обратное, что B не всегда D.
Здравствуйте, matcode, Вы писали:
D>>Если говорить о типах, а тип в свою очередь рассматривать как множество объектов, обладающих определенными свойствами, то да. В нотации теории множеств: D>>
D>>B ={x | PB(x)}
D>>D ={x | PD(x) /\ PB(x)}
D>>
D>>Подразумевается, что x берутся из большого универсума, и PB(x), PD(x) — предикаты над элементами универсума. Чтобы D было подмножеством (subtype) B необходимо, чтобы для любого его элемента выполнялся предикат PB(x).
M>Подмножество и подтип не тождественные понятия. M>Простой пример: квадрат является подмножеством прямоугольника но не являеться его подтипом. M>Или например в С/С++ типы short и long.
Запиши определения того, что есть квадрат и что есть прямоугольник, на языке множеств c выделением по предикатам
Здравствуйте, igna, Вы писали:
I>Верно ли следующее?:
I>Если классы B и D связаны отношением D Is-a B; то любое утверждение истинное для B, является истинным для D.
Неверно. Во всяком случае для C++
Доказательство:
Дано:
struct B { ... };
struct D: B { ... };
D d;
B& b = d;
if (b.predicate())
assert(d.predicate()); // 1
Надо определить такой predicate, что бы утверждение (1) было ложно.
Легко:
struct B {
bool predicate() { return true;}
};
struct D: B {
bool predicate() { return false;}
};
Здравствуйте, matcode, Вы писали:
M>Ваше утверждение не удовлетворяет условию см. выделенное
Верно ли, что «любое утверждение истинное для B, является истинным для D»
Моё утверждение: x is not D.
B is not D = true when B != D
D is not D = false
=> не любое
При этом наличие или отсутствие связи Is-a не играет никакой роли, потому что само условие логически противоречиво. Нет таких различимых объектов (в философском смысле — любой объект) B и D, чтобы для них выполнилось это условие, это нарушает философский принцип A=A.
Здравствуйте, igna, Вы писали:
I>Верно ли следующее?: I>Если классы B и D связаны отношением D Is-a B; то любое утверждение истинное для B, является истинным для D.
Если утверждение является инвариантом B, то верно.
Если утверждение является предусловием B, то верно (для подтипов требуется контрвариантность предусловий).
Если утверждение является постусловием B, то верно (для подтипов требуется ковариантность постусловий).
В ином случае, вообще говоря, неверно.