Ограничьте OPA Rego одним правилом

Если у меня есть такое правило: (детская площадка)

package play

rule[message] {
    max_index := count(input)-1

    some i

    index_a = i
    index_b = (max_index-i)
    point_a := input[index_a]
    point_b := input[index_b]

    point_a != point_b

    message := sprintf("%d (%s) and %d (%s)", [index_a, point_a, index_b, point_b])
}

и введите этот ввод:

["a", "b", "c"]

У меня есть несколько решений для своего правила, например

"0 (a) and 2 (c)",
"2 (c) and 0 (a)"

Есть ли способ остановить поиск OPA после того, как будет найдено какое-либо решение?

1 ответ

Решение

Сегодня нет возможности попросить OPA остановиться после единственного ответа. Алгоритмы это поддерживают, но, похоже, людям это не нужно.

Вы, безусловно, можете запросить первый ответ, который найдет OPA, превратив свой набор в массив и захватив первый элемент. Детская площадка

array_rule = [message | rule[message]]
first = array_rule[0]

В качестве альтернативы, если порядок важен, вы можете написать свою логику как понимание массива для начала, а затем снова захватить первый элемент. Детская площадка

array_rule = [message |
    max_index := count(input)-1

    some i

    index_a = i
    index_b = (max_index-i)
    point_a := input[index_a]
    point_b := input[index_b]

    point_a != point_b

    message := sprintf("%d (%s) and %d (%s)", [index_a, point_a, index_b, point_b])
]

first = array_rule[0]
Другие вопросы по тегам