Ожидается, что программа Clingo будет удовлетворительной

Я тестирую некоторые программы, использующие арифметику в Clingo 5.0.0, и я не понимаю, почему следующая программа неудовлетворительна:

#const v = 1.

a(object1).
a(object2).
b(object3).
value(object1,object2,object3) = "1.5".
value(X,Y,Z) > v, a(X), a(Y), b(Z), X!=Y :- go(X,Y,Z).

Я ожидал ответа, содержащего: a(object1) a(object2) b(object3) go(object1,object2,object3).

Возможно, мне чего-то не хватает в арифметике с Clingo.


person Olivier    schedule 13.04.2021    source источник


Ответы (1)


Я боюсь, что здесь есть некоторые недоразумения относительно ASP.

  1. Вы не можете присваивать значения предикатам (value(a,b,c)=1.5). Предикаты образуют атомы, которые могут быть истинными или ложными (содержаться в наборе ответов или нет).
  2. Я предполагаю, что ваше последнее правило должно вывести атом go (X, Y, Z). Правила работают наоборот, то, что выводится, находится в левой части.
  3. Арифметика с плавающей запятой невозможна, вам придется масштабировать ваши значения до целых чисел.

Ваша проблема может выглядеть так, но это просто блуждание в темноте:

#const v = 1.

a(object1).
a(object2).
b(object3).
value(object1,object2,object3,2).
go(X,Y,Z) :- value(X,Y,Z,Value), Value > v, a(X), a(Y), b(Z), X!=Y.

Последнее правило гласит: Выведите go(object1,object2,object3), если value(object1,object2,object3,2) верно, и 2 > 1, и a(object1) верно, и a(object2) верно, и b(object3) верно, и object1 != object2.

person Max Ostrowski    schedule 14.04.2021
comment
Большое спасибо за этот подробный ответ. Действительно, это то, чего я пытался достичь. Мне нужно продолжать обучение ASP. - person Olivier; 15.04.2021