【发布时间】:2022-01-15 13:38:14
【问题描述】:
这是一些我没有按原样测试过的简化代码(因此它可能包含错误),展示了我遇到的问题:
type Space is private;
--Depending on members of Space, determines whether Outer fully contains Inner
function Contains(Outer : Space; Inner : Space);
--Outer should fully contain Inner
type Nested_Space is
record
Inner : Space;
Outer : Space;
end record
with Dynamic_Predicate => Contains(Outer, Inner);
我无法找到一种方便的方法来初始化 Nested_Space 而不会使谓词定义的断言失败。如果我尝试先设置 Inner 的成员,Outer 的成员仍然在他们默认的地方。但是,如果我尝试先将成员设置为 Outer,则 Inner 的成员仍然在他们默认的位置。即使我尝试对任一类型强制使用默认值,仍然无法选择一个肯定会在任意 Nested_Space 范围内的默认值。
甚至尝试使用类似的东西进行初始化
declare
My_Inner : Space := (...);
My_Outer : Space := (...);
My_NS : Nested_Space := (Inner => My_Inner, Outer => My_Outer);
begin
....
end;
我似乎无法避免断言失败。我可以想出一些非常笨拙的想法(例如将 Initialized : Boolean 添加到 Nested_Space 专门用于检查谓词,或者设置两个不同空间的成员)但我希望可能有一个不影响的解决方案用例不需要的东西的记录结构。
如果 ARM 中没有解决方案,欢迎使用 GNAT 解决方案。
提前致谢!
【问题讨论】:
-
只是好奇。为什么您希望您的记录包含您标记为内部的相同值的两个实例?您的记录有一个名为内部的空间和另一个名为外部的空间,它们必须是内部的超集。创建一个函数来初始化为附加值提供 Inner 和另一个参数的记录,然后创建一个由 Inner 构造的 Outer 加上第二个参数中的附加值的记录不是更容易吗?