Как использовать отрицание, чтобы выбрать максимум в Clingo - PullRequest
0 голосов
/ 01 мая 2020

В прологе мы можем использовать отрицание для выбора максимума в кортеже, например: p (X), а не (p (Y), Y> X). % работают в Прологе, но не работают в Clin go

Как использовать выражение Clin go для получения аналогичных правил (если число не больше, чем A, то A - максимум). Спасибо.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я бы хотел дополнить предыдущий ответ двумя альтернативными решениями. Я не проводил сравнений производительности с первым ответом.

  • Использование агрегатов, см. Clin go Руководство пользователя

    max ( X): - X = #max {Y: p (Y)}.

  • Угадай и проверь подход. Идея состоит в том, что мы угадываем максимум, а затем проверяем, действительно ли это максимум. Обратите внимание, что арифметические c выражения могут быть записаны в главе правил.

    1 {max (X): p (X)} 1.

    M> = X: - p ( Х), не более (М).

0 голосов
/ 05 мая 2020

Следующие правила могут представлять , если число не превышает A, тогда A является максимальным .

non_max(X) :- p(X), p(Y), Y > X.
max(X) :- p(X), not non_max(X).

По сути, правило, которое вы представляете, является правилом с универсальный квантор, т.е.

∈b ∈ p (b), если a> b, то a является максимумом. (1)

Если a - максимум, то ∀b ∈ p (b), a> b. (2)

Преобразовать (2) в его противоположное, имеем

Если ∈b ∈ p (b), a

соответствующее правило (3) равно non_max(X) :- p(X), p(Y), Y > X.

Поскольку max и non_max являются взаимоисключающими, то имеем max(X) :- p(X), not non_max(X).

...