gpt4 book ai didi

prolog - 无法从 CLPFD 最小化工作

转载 作者:行者123 更新时间:2023-12-01 11:50:17 27 4
gpt4 key购买 nike

我和一个 friend 正在编写一个应该解决 CLP 问题的程序。我们想使用最小化来优化解决方案,但它不起作用,因为它一直说我们从 sum(P,#=,S) 得到的数字介于两个数字之间(例如 5..7)。我们无法找到从中提取任何数字或以任何方式操纵它的好方法,因此正在寻求您的帮助。

问题似乎出自我们的 gen_var 方法,该方法说列表的每个元素必须介于 0 和 1 之间,因此有些数字显示为“0..1”而不是正确设置。

即使我们得到一个像“5..7”这样的数字,有没有办法使用最小化,或者有什么方法可以操纵这个数字,这样我们只能得到 5? S(列表中元素的总和)是我们试图最小化的。

gen_var(0, []).
gen_var(N, [X|Xs]) :-
N > 0,
M is N-1,
gen_var(M, Xs),
domain([X],0,1).

find([],_).
find([H|T],P):- match(H,P),find(T,P).

match(pri(_,L),P):-member(X,L), nth1(X,P,1).

main(N,L,P,S) :- gen_var(N,P), minimize(findsum(L,P,S),S).
findsum(L,P,S):- find(L,P), sum(P,#=,S).

最佳答案

我稍微修改了你的代码,以适应 SWI-Prolog CLP(FD),它似乎工作(有点)。但我认为最小值总是 0!

:- use_module(library(clpfd)).

gen_var(0, []).
gen_var(N, [X|Xs]) :-
N > 0,
M is N-1,
gen_var(M, Xs),
X in 0..1 .

find([], _).
find([H|T], P):-
match(H, P),
find(T, P).

match(pri(_,L),P):-
member(X, L),
nth1(X, P, 1).

findsum(L,P,S) :-
find(L, P),
sum(P, #=, S).

main(N, L, P, S) :-
gen_var(N, P),
findsum(L, P, S),
labeling([min(S)], P).

这个输出样本是预期结果的正确子集吗?
?- main(3,A,B,C).
A = [],
B = [0, 0, 0],
C = 0 ;
A = [],
B = [0, 0, 1],
C = 1 ;

关于prolog - 无法从 CLPFD 最小化工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7525972/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com