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

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

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

Q2. У меня есть бинарный предикат wrap(E,T), где E, T варьируются от 1 до M, N; как я могу указать, что для каждого E существует хотя бы один T такой, что wrap(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. Какую книгу вы можете предложить для хорошего введения в программирование наборов ответов?


person Vor    schedule 04.02.2015    source источник
comment
Вау, сколько вопросов! Я предлагаю вам разделить их и задать по отдельности, иначе вы рискуете закрыть этот вопрос как слишком широкий.   -  person shree.pat18    schedule 04.02.2015
comment
@shree.pat18: Я почти уверен, что на все вопросы есть очень краткий ответ :-)   -  person Vor    schedule 04.02.2015


Ответы (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. Тем не менее, абсолютно лучшее, что я читал, - это «Решение набора ответов на практике» обычных подозреваемых Гебсера, Камински, Кауфманна, Шауба. При чтении материалов, связанных с коллекцией potassco, вам нужно настроиться между языковыми различиями гринго 3 и гринго 4, что не очень хорошо объясняется в официальном руководстве, как и в любом другом источнике, который я видел.

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

person vukk    schedule 04.02.2015
comment
Спасибо за быстрый ответ!!! Что касается Q4, я имею в виду, что если выполняется C(A), то p1(A),p2(A) оба истинны или оба ложны (или в другой форме C(A) -> ( p1(A) ‹-> p2( С) ) ). Q3: Я нахожу очень странным, что нет возможности для краткого ИЛИ (это довольно распространено) :-S Q1, Q2: хорошо! Q5: действительно, у меня уже были некоторые проблемы с тривиальным #hide, который исчез в гринго 4 :-) :-) Вы также знаете специальный форум, где такие вопросы/просьбы о помощи приветствуются? - person Vor; 04.02.2015
comment
Я отредактировал ответ выше. Я не знаю никаких форумов, кроме этого. Вы можете найти hakank.org/answer_set_programming ценным ресурсом, поскольку в настоящее время, кроме книги, упомянутой выше , лучший способ изучить ASP — это читать кодировки, сделанные другими. Я также рекомендую сравнить ваши решения, чтобы узнать, что быстро, а что нет. Также взгляните на вывод clingo --help=3. И gringo -t бесценен. - person vukk; 05.02.2015
comment
Доступно новое руководство по инструментам Potassco 2.0, я добавил его в ответ. - person vukk; 09.06.2015