Prolog 使用具体化约束使3个数字连续
以下是我的SWI Prolog程序的概要:Prolog 使用具体化约束使3个数字连续,prolog,constraints,clpfd,sicstus-prolog,Prolog,Constraints,Clpfd,Sicstus Prolog,以下是我的SWI Prolog程序的概要: :- use_module(library(clpfd)). consec1(L) :- L=[L1,L2,L3,L4,L5,L6,L7,L8,L9], L ins 1..9, ..., abs(L5-L4)#=1, all_different(L), labeling([],L) abs(L5-L4)#=1使L5和L4相邻。如果我想让三个数字彼此相邻,例如L3、L4和L5,我如何使用具体化约束来实现这一点 例如
:- use_module(library(clpfd)).
consec1(L) :-
L=[L1,L2,L3,L4,L5,L6,L7,L8,L9],
L ins 1..9,
...,
abs(L5-L4)#=1,
all_different(L),
labeling([],L)
abs(L5-L4)#=1
使L5
和L4
相邻。如果我想让三个数字彼此相邻,例如L3
、L4
和L5
,我如何使用具体化约束来实现这一点
例如,
L3=4
,L5=5
,L4=6
或L4=7
,L5=8
,L3=9
这实现了您在评论中给出的连续性。对于N
值的列表,我们需要足够的空间使所有值都适合于它们之间,并且所有值都需要不同
consecutive([]). % debatable case
consecutive(Xs) :-
Xs = [_|_],
length(Xs, N),
all_different(Xs),
max_of(Max, Xs),
min_of(Min, Xs),
Max-Min #= N-1.
max_of(Max, [Max]).
max_of(Max0, [E|Es]) :-
Max0 #= max(E,Max1),
max_of(Max1, Es).
min_of(Min, [Min]).
min_of(Min0, [E|Es]) :-
Min0 #= min(E, Min1),
min_of(Min1, Es).
TL;DR:评论时间过长:有专门限制的播放时间
这个答案是跟进的;SICStus Prolog的最新版本提供了专门的clpfd约束
maximum/2
和minimum/2
,作为minu of/2
和max of/2
的替代方案
使用以下代码进行基准测试1,2
:- ().
:-使用_模块()。
工作台(如何,N,Ub):-
\+\+((Xs,N),
(Xs,1,Ub),
(Xs),
Max-MinN-1,
(How=0
;How=min_of,max_of(max,Xs),min_of(min,Xs)
;How=最小值、最大值(Max,Xs)、最小值(Min,Xs)
),
([enum],Xs))。
。。。我们运行以下测试:
脚注1:使用SICStus Prolog版本4.3.2(64位)。
脚注2:回答顺序经过后处理以改善外观。
带“continuoused”,你是指例如
(L2#=L1+1#/\L3#=L2+1)#/(L2#=L1-1#/\L3#=L2-1)
?同样,这种关系应该适用于L的所有3个相邻成员,还是仅适用于某些/任何成员?
?- between(6, 8, N), NN #= N+N, call_time(bench_(v1,N,NN),T_ms).
N = 6, NN = 12, T_ms = 50
; N = 7, NN = 14, T_ms = 300
; N = 8, NN = 16, T_ms = 2790.
?- between(6, 8, N), NN #= N+N, call_time(bench_(v2,N,NN),T_ms).
N = 6, NN = 12, T_ms = 20
; N = 7, NN = 14, T_ms = 100
; N = 8, NN = 16, T_ms = 830.