Вопросы новичка по программированию набора ответов
Я абсолютно новичок в 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/