【问题标题】:Clingo: Can I match multiple variables (sorta like varargs)?Clingo:我可以匹配多个变量(类似于 varargs)吗?
【发布时间】:2021-10-20 14:35:18
【问题描述】:

我正在寻找这样的东西:

g(X, ...Y) :- f(X, ...Y) .

这将是一个语法糖:

g(X, Y) :- f(X, Y) .
g(X, Y, Z) :- f(X, Y, Z) .
g(X, Y, Z, Z1) :- f(X, Y, Z, Z1) .
%...and so on

有没有什么办法可以提供一些这样的语法糖,我只需要少打字吗?

【问题讨论】:

标签: answer-set-programming clingo


【解决方案1】:

不,谓词的参数没有这样的东西。 但你可以改用函数。

f((1)).
f((1,2)).
f((1,2,3)).
f((1,2,3,4)).
g(X) :- f(X).

这里的关键是f 只有一个参数,它是一个元组。 而X 指的是整个元组。 然后,您仍然可以使用访问特定元组的单个元素 h(X) :- g((,,X)).

备注: 我认为一般来说,您的数据结构存在问题,您的 f/n 具有未知数量的参数。您无法编写有关这些事实的规则,因为您不知道参数的含义或数量。如果你想存储例如[a,b,c,d,e] 的列表,使用类似:

f(id1,a).
f(id1,b).
f(id1,c).
f(id1,d).
f(id1,e).

然后这些事实可以与: 运算符一起使用来生成集合等...

【讨论】:

  • 谢谢!使用元组是个好主意。虽然看起来手工编写复杂的 Clingo 程序是一件苦差事,但我将使用 python 或其他东西将我自己的复杂表示转换为类似于您的选项 2 的东西,这更容易推理。
  • 事实的创建应该是自动化的,毫无疑问。规则的创建不应该是自动化的,而应该是手工完成的。这是一个常见的陷阱。如果你需要别的东西,你就做错了(只是一个经验法则)
猜你喜欢
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多