答案集编程获取系列长度作为输入

时间:2013-10-23 14:45:14

标签: logic-programming answer-set-programming

我是Answer Set Programming的新手,并尝试将问题编码到ASP中。我认为这是一个简单的问题。这是代码;

events(1..3).
sequence(A,B,C) :- events(A;B;C), A!=B, A!=C, B!=C.

如您所见,有一个由事件组成的序列。在这种情况下,它的长度为3.但是我希望它由用户决定。例如;

  • 如果用户想要长度为3,那么
  

gringo asp.lp --const n = 3 |扣

代码应该是这样的;

events(1..3).
sequence(A,B,C) :- events(A;B;C), A!=B, A!=C, B!=C.
  • 如果用户想要长度为4,那么
  

gringo asp.lp --const n = 4 |扣

代码应该是这样的;

events(1..4).
sequence(A,B,C,D) :- events(A;B;C;D), A!=B, A!=C, A!=D, B!=C, B!=D, C!=D.

我怎么能这样做? 谢谢,

1 个答案:

答案 0 :(得分:0)

实际上,使用一些漂亮的递归,你可以获得每种可能排列的lisp风格列表。

这是我的程序:

top(n).
num(1..T) :- top(T).

partial_pattern(nil, 0).
unused(N,nil) :- num(N).
partial_pattern(cons(N,P),K+1) :- num(N), partial_pattern(P,K), unused(N,P).
unused(M,cons(N,P)) :- partial_pattern(cons(N,P),_), N!=M,unused(M,P).

pattern(P) :- partial_pattern(P,T), top(T).

#show pattern/1.