检查数组是否包含在 rego 中的另一个数组中

Check if array contained within another in rego

我有两个数组:xy 我想检查 x 是否包含在 y.

rego 中没有 contains() 函数。

接下来我尝试创建与 contains() 函数等价的数学函数:

x ⊆ y ⇔ (x ⋂ y) == x.

所以我尝试执行以下操作:

z := x & y
x == z

但这会产生以下错误:

rego_type_error: and: invalid argument(s) have: (array[any], any, ???) want: (set[any], set[any], set[any])

那我该怎么做呢?

Set operations 仅适用于.. 好吧,集合 :) 如果您正在创建 x y 作为新集合(只需使用 {...} 而不是 [...]) 你的例子应该有效。如果 xy 是数组——就像引用 input 中的值时经常出现的情况——你可以使用集合理解来转换它们,比如:

xs := {e | e := x[_]}
ys := {e | e := y[_]}

然后用xsys作为集合。另一方面,如果你真的想使用数组(比如排序和重复值很重要),你可以这样做:

contained {
    y[i]
    x == array.slice(y, i, i + count(x))
}

这将遍历 y 数组,并为每个项目从 i 创建一个 y 的切片,并且长度与 x 数组相同,如果一个这样的切片等于 x.

,则 return 为真