gpt4 book ai didi

prolog - 打印名片 - 一种背包任务

转载 作者:行者123 更新时间:2023-12-03 01:24:03 26 4
gpt4 key购买 nike

我是 Prolog 新手,我对一段代码有一些可能简单的问题。这是上周五出现的现实世界问题,相信我这不是计算机科学作业。

我们想要打印名片,但只能以 900 张卡片为一组进行打印(100 张,每张 9 张卡片)。任何人的卡片都不应该分布在几个区 block 上。人们订购了不同数量的卡片,例如:

% "braucht" is german and means "needs"
braucht(anton,400).
braucht(berta,200).
braucht(claudia,400).
braucht(dorothee,100).
braucht(edgar,200).
braucht(frank,400).
braucht(georg,100).

我将以下定义放在一起,以找到合适的 900 张名片 block :

block(0,[]).
block(N,[H|T]) :-
braucht(H,Nh),
% \+(member(H,T)),
D is N - Nh,
D >= 0,
block(D,T).

这会生成一个很好的人员 block 列表,这些人的卡片可以放在 900 张卡片 block 上。但如果我激活注释行“\+member...”并且只给我一个“false”,它就会停止工作。但我需要确保没有人在该区 block 上获得多次。我在这里做错了什么?

最佳答案

看来你想要实现的是设置一个约束,让H不出现在列表的尾部T中。但是,当您调用 member/2 时,T 仍然未绑定(bind),因此 member(H, T) 将成功,因此 \+ member(H,T) 将失败。

如果你不想使用约束编程,而是使用纯 Prolog,你应该使用另一个方向的检查,检查 H 是否已经存在于具有以下条件的人员列表中:到那时为止已汇总。像这样的东西:

block(0, List, List).
block(N, Rest, List) :-
braucht(H, Nh),
\+(memberchk(H, Rest)), % will fail when H is already in Rest
D is N-Nh,
D >= 0,
block(D, [H|Rest], List).

可以从谓词 block/2 调用谓词 block/3:

block(N, List) :-
block(N, [], List).

关于prolog - 打印名片 - 一种背包任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8779115/

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