访问所有已发布的 clpfd 约束 SWI 与 Sicstus Prolog
Access all posted clpfd constraints SWI vs Sicstus Prolog
我正在尝试解决一个问题。
我正在编写一个与 Sicstus-Prolog 一起使用的程序,我需要一个我只在 SWI-Prolog 中发现的功能。
具体来说,我正在尝试获取所有 clp(fd) 约束,这些约束在 运行 执行以下示例代码时发布。我不想运行贴标签。
% Sicstus Prolog
% ?- N=4, length(List,N), domain(List, 1, N), all_different(List), bar(List), copy_term(List,List,M).
% SWI-Prolog
% ?- N=4, length(List,N), List ins 1..N, all_different(List), bar(List), copy_term(List,List,M).
:- use_module(library(clpfd)).
bar([]).
bar([Var|T]) :-
bar_aux(Var,T,1),
bar(T).
bar_aux(_,[],_).
bar_aux(Var,[Var2|T],N) :-
Var #\= Var2 + N,
N1 is N + 1,
bar_aux(Var,T,N1).
问题是,虽然 SWI 实际上 returns 所有约束,但 sicstus 没有。
那么我怎样才能强制进一步评估,让 sicstus 也 returns 更像这样:
% Actual SWI return value.
[
:(clpfd,in(_25130,..(1,4))),
:(clpfd,#\=(_25130,+(_25346,3))),
:(clpfd,#\=(_25130,+(_25274,2))),
:(clpfd,#\=(_25130,+(_25202,1))),
:(clpfd,all_different([_25130,_25202,_25274,_25346])),
:(clpfd,in(_25346,..(1,4))),
:(clpfd,#\=(_25274,+(_25346,1))),
:(clpfd,#\=(_25202,+(_25346,2))),
:(clpfd,in(_25274,..(1,4))),
:(clpfd,#\=(_25202,+(_25274,1))),
:(clpfd,in(_25202,..(1,4)))
]
而不只是:
% Actual sicstus return value.
[
:(clpfd,in(_A,..(1,4))),
:(clpfd,in(_B,..(1,4))),
:(clpfd,in(_C,..(1,4))),
:(clpfd,in(_D,..(1,4)))
]
非常感谢所有帮助!
您需要先 assert(clpfd:full_answer).
才能获得约束。
我正在尝试解决一个问题。 我正在编写一个与 Sicstus-Prolog 一起使用的程序,我需要一个我只在 SWI-Prolog 中发现的功能。
具体来说,我正在尝试获取所有 clp(fd) 约束,这些约束在 运行 执行以下示例代码时发布。我不想运行贴标签。
% Sicstus Prolog
% ?- N=4, length(List,N), domain(List, 1, N), all_different(List), bar(List), copy_term(List,List,M).
% SWI-Prolog
% ?- N=4, length(List,N), List ins 1..N, all_different(List), bar(List), copy_term(List,List,M).
:- use_module(library(clpfd)).
bar([]).
bar([Var|T]) :-
bar_aux(Var,T,1),
bar(T).
bar_aux(_,[],_).
bar_aux(Var,[Var2|T],N) :-
Var #\= Var2 + N,
N1 is N + 1,
bar_aux(Var,T,N1).
问题是,虽然 SWI 实际上 returns 所有约束,但 sicstus 没有。
那么我怎样才能强制进一步评估,让 sicstus 也 returns 更像这样:
% Actual SWI return value.
[
:(clpfd,in(_25130,..(1,4))),
:(clpfd,#\=(_25130,+(_25346,3))),
:(clpfd,#\=(_25130,+(_25274,2))),
:(clpfd,#\=(_25130,+(_25202,1))),
:(clpfd,all_different([_25130,_25202,_25274,_25346])),
:(clpfd,in(_25346,..(1,4))),
:(clpfd,#\=(_25274,+(_25346,1))),
:(clpfd,#\=(_25202,+(_25346,2))),
:(clpfd,in(_25274,..(1,4))),
:(clpfd,#\=(_25202,+(_25274,1))),
:(clpfd,in(_25202,..(1,4)))
]
而不只是:
% Actual sicstus return value.
[
:(clpfd,in(_A,..(1,4))),
:(clpfd,in(_B,..(1,4))),
:(clpfd,in(_C,..(1,4))),
:(clpfd,in(_D,..(1,4)))
]
非常感谢所有帮助!
您需要先 assert(clpfd:full_answer).
才能获得约束。