Clingo: создать пользовательскую функцию

Я в конце, чтобы создать "функцию" в клинго, если таковая может быть определена. В упрощенной версии того, что я пытаюсь выполнить, я написал эту очень короткую программу:

a(1..3).

adj(X,Y) :- a(X), a(Y), abs(X-Y)==1.

#hide a/1.

По сути, я хочу определить функцию смежности, которая будет содержать любые два числа true если абсолютная величина их разности равна единице. То, что я ожидал бы от вышеупомянутой программы, должно вывести результаты: adj(1,2) adj(2,1) adj(2,3) adj(3,2)Тем не менее, мне представлен этот вывод:

Answer: 1

SATISFIABLE

Models       : 1
Time         : 0.000
  Prepare    : 0.000
  Prepro.    : 0.000
  Solving    : 0.000

(если я опущу #hide a/1. он выведет ответ: a(1) a(2) a(3)).

Я чувствую, что это clingo 101, так что, может быть, я неправильно понимаю основы здесь. Я пытаюсь выучить клинго, изучая примеры, с которыми я сталкиваюсь в Интернете, но я как бы тороплюсь с этим, потому что у меня назначено задание завтра. Если бы кто-нибудь мог пролить немного света, это было бы здорово. Благодарю.

1 ответ

Решение

Решаемые. Оказывается родной abs функция на самом деле не работает так, как я ожидал, но определяя оба условия для adj Функция выполняет дизъюнктивный трюк и работает как шарм. Это:

a(1..3).

adj(X,Y) :- a(X), a(Y), X-Y==1.
adj(X,Y) :- a(X), a(Y), Y-X==1.

#hide a/1.

Выходы:

Answer: 1
adj(3,2) adj(2,1) adj(2,3) adj(1,2) 
SATISFIABLE

Models      : 1     
Time        : 0.000
  Prepare   : 0.000
  Prepro.   : 0.000
  Solving   : 0.000
Другие вопросы по тегам