【问题标题】:asp (clingo) : why are ordered sums not workingasp (clingo) : 为什么排序总和不起作用
【发布时间】:2017-01-09 13:24:26
【问题描述】:

考虑下面的代码,用 cligo 编译。

文件test.lp。编译命令:clingo 0 test.lp.

col(("rot";"blau")).

freq("rot","hell",2). freq("rot","dunkel",2). freq("rot","hell",5).
freq("blau","hell",20). freq("blau","dunkel",30). freq("blau","hell",50).

freq_sum(C,F) :- F = #sum{ X : freq(C,_,X) }, col(C).
%% does not work: >>error: syntax error, unexpected [, expecting {<<
% freq_sum(C,F) :- F = #sum[ X : freq(C,_,X) ], col(C).

#show freq_sum/2.

代码应计算每种颜色的频率总和。对于"red",这应该是9,对于“blue",这应该是100。对于"red",值2 被计算两次。当我将{...}替换为[…] 时,这应该使列表成为有序列表并提供有序总和,编译器会抱怨error: syntax error, unexpected [, expecting {。我有clingo version 4.5.4。我的代码或编译器有问题吗?

谁能告诉我,我如何在 asp 中执行一个有序的求和?

【问题讨论】:

    标签: compiler-errors answer-set-programming clingo


    【解决方案1】:

    万一有人遇到这个问题,我找到了解决方案。问题是版本 4 中的 cligo/gringo 版本不支持多集。只能通过{...} 进入列表。尽管如此,还是有一种方法可以防止多个元素折叠。

    freq_sum(C,F) :- F = #sum{ X,H : freq(C,H,X) }, col(C).
    

    对发生索引的对象进行命名,允许列表中的每个项目被唯一标记,防止重复值被视为单个元素。我在http://ceur-ws.org/Vol-1645/paper_9.pdf 的§2 中找到了这个解决方案。

    【讨论】:

    • 该语言的正式定义在 ASP-Core-2 标准 mat.unical.it/aspcomp2013/files/ASP-CORE-2.01c.pdf ... 聚合(如 #sum)在 1.3 中在语法上定义,在 2.4 中在语义上定义。事实上,在上面的解决方案中,总和建立在元组“X,H”的第一个元素之上,因此“X”和“H”仅作为元组之间的区别元素。
    • 谢谢,是的,这基本上就是我在帖子后半部分写的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多