Есть ли способ представить кортеж произвольной длины в Clingo?

Если я хочу получить заголовок кортежа произвольной длины, мне нужно кодировать так: head(A) :- tuple(A,B). голова(А):-кортеж(А,В,С). голова (A): - кортеж (A, B, C, D). .......

Есть ли метод, который может представлять голову (A): - кортеж (A...).

Спасибо!


person bin gui    schedule 12.05.2020    source источник
comment
Есть ли причина, по которой вам нужно представлять кортежи с разной арностью? Если нет, то вы можете представить кортежи в виде списков, то есть tuple(d,e,f) можно представить как tuple(d, tuple(e, tuple(f, nil))).. Тогда предикат head может быть определен как head(X) :- tuple(X, _).   -  person tphilipp    schedule 13.05.2020


Ответы (1)


Я вижу два возможных решения:

Избегайте терминов с разной арностью

Это можно сделать, изменив представление кортежей:

tuple(a, nil).
tuple(b, tuple(c, nil)).
tuple(d, tuple(e, tuple(f, nil))).

head(X) :- tuple(X, _).

Использование внешних функций в Clingo

Clingo поддерживает определение внешних функций, см. Python API и руководство. Например, мы можем написать на Python функции, которые могут манипулировать терминами. В качестве обходного пути я предлагаю использовать дополнительный конструктор терминов, здесь c.

#script (python)
import clingo
def head(x):
      return x.arguments[0]
#end.

tuple(c(1)).
tuple(c(2,3)).
head(@head(X)) :- tuple(X).
person tphilipp    schedule 12.05.2020