Вопросы новичка по программированию набора ответов

Я абсолютно новичок в Clingo (и логическом программировании) и ищу лучший способ реализовать следующие основные ограничения:

Q1. У меня есть предикат selected(T) где Т составляет от 1 до N=5; как я могу указать, что существует хотя бы один T такой, который выбран (T)?

Q2. У меня есть двоичный предикат wrap(E,T) где Е, Т колеблются от 1 до М, Н; Как я могу указать, что для каждого E существует хотя бы один T такой, что обернуть (E, T)?

Q3. Как я могу указать, что если selected(a) ИЛИ ЖЕ selected(b) затем selected(c) должен быть ложным

Я на самом деле использую две строки кода, но, вероятно, есть лучший способ:

  :- selected(c), selected(a) .
  :- selected(c), selected(b) .

Q4. Как я могу указать, что если определенное условие C(A) истинно, то два унарных предиката p1(A) и p2(A) должны иметь одинаковое значение?

Я на самом деле использую две строки кода:

p1(A) :- C(A), p2(A)
      :- C(A), not p2(A), p1(A)

Q5. Какую книгу вы предлагаете для хорошего введения в программирование набора ответов?

1 ответ

Решение

Q1:

%%%% Config
#const n = 5.
%%%% Code
% selected is not an empty predicate
1 { selected(1..n) }.

Q2:

%%%% Config
%% N
#const n = 5.
%% M
#const m = 4.

%%%% Helpers
%% Ts
t(1..n).
%% Es
e(1..m).

%%%% Code
% there is an E, then there must be at least one
% wrap(E,T) where T is from t
1 { wrap(E, T) : t(T) } :- e(E).

Q3:

:- selected(c), selected(a;b).

Q4: я действительно думал

:- c(A), p1(A)!=p2(A).

будет работать, но, видимо, нет. Я думаю, что самый ясный способ написать это было бы

:- c(A), not p1(A), p2(A).
:- c(A), p1(A), not p2(A).

хотя я не доволен использованием "не". Возможно, кто-то, кто недавно использовал ASP, помнит лучшее решение. В качестве альтернативы вы можете расширить p1 и p2 для двоичных предикатов и написать

:- c(A), p1(A,P1), p2(A,P2), P1!=P2.

Q5: К сожалению, на мой взгляд, нет хороших книг для ASP. Тем не менее, самый лучший из тех, что я прочитал, - "Решение набора вопросов на практике" от обычных подозреваемых Гебсера, Камински, Кауфмана, Шауба. При чтении материалов, относящихся к коллекции потасско, вам нужно будет скорректировать различия между языками гринго 3 и гринго 4, что в официальном руководстве не очень хорошо объясняется, равно как и никакой другой ресурс, который я видел.

РЕДАКТИРОВАТЬ: Теперь есть новое руководство для инструментов Potassco с обновленным синтаксисом для clasp 3 и gringo/clingo 4.5, найти его здесь: http://sourceforge.net/projects/potassco/files/guide/2.0/

Другие вопросы по тегам