2

我是答案集编程的新手,并试图将问题编码到 ASP 中。我认为这是一个简单的问题。这是代码;

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

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

  • 如果用户希望它的长度为 3,那么

外国佬 asp.lp --const n=3 | 表扣

代码应该是这样的;

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

外国佬 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.

我怎么能那样做?谢谢,

4

1 回答 1

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.
于 2014-01-11T03:23:12.187 回答