我制作了一个 prolog 程序,向我展示了在 dvd 上安装内容的最佳方式。问题在代码的注释中以供参考,我将在下面粘贴,但归结为:
是否有一种倒切运算符可以让它搜索更多,尽管它已经匹配?参见 fitexact,类似于 fitexact(Size,Sum,L,L):-Sum
跟踪已处理电影的最佳方式是什么?我收回它们,但想知道没有它怎么做。
fitfuzzy 使用一个
ifthen构造。我不知道该怎么想他们,在序言中感觉很奇怪。然而,试图使其递归让我非常困惑:)
% 给出电影和大小的列表,尝试将它们全部放入 dvd
% 尽可能少地浪费空间。
% 设置 DVD 大小
DVD尺寸(4812)。
数据库中所有电影的百分比总和
电影大小(大小):- findall(S,电影(_,S),LS),sum_list(LS,大小)。
数据库中所有电影的百分比
电影计数(计数):- findall(S,电影(_,S),LS),长度(LS,计数)。
% 看看哪些完全适合
%这是我遇到麻烦的地方,最初的想法是
% 它喜欢下面的模糊搜索,但我不明白我怎么能
% express '当没有更多适合的电影时,
% 并且总和小于 dvdsize 列表也可以。
fitexact(电影):- dvdsize(大小),fitexact(大小,0,[],电影)。
% 完美契合时停止
% 所以我在这里尝试了 Size,Sum 和 Sum<Size 。那显然
% 不起作用,因为它立即匹配。
fitexact(大小,大小,电影,电影)。
% 因为否则相同的电影会出现在不同的 DVD 上
% 认为最好在安装后删除它们。
%如果我不想这样做,那么确保一次的最佳方法是什么
% 电影已处理,它不会再次出现?它应该有一个额外的
% flag like processes(movie(name,size,processed) 或者我应该断言
% 完成了 dvd,看看它们是否已经在其中?我想知道这个多久
% all 会采取,因为它已经很慢了。
%%:-
%% forall(成员(电影,电影),收回(电影(电影,_)))。%%, !.
% 否则继续填充
fitexact(大小、总和、累积、电影):-
电影(电影,电影大小),
\+ 成员(电影,Acc),% 没有双打!
NewSum 是 Sum + MovieSize,
NewSum =< 大小,
fitexact(大小,NewSum,[电影|Acc],电影)。
删除vd(DVD):-
forall(成员(电影,DVD),撤回(电影(电影,_)))。
% 做一个模糊拟合,当尺寸减小时尝试精确拟合
% 没有精确的拟合。
fitfuzzy(DVD) :- dvdsize(Size), fitfuzzy(DVD,Size,0)。
fitfuzzy(_,Size,Size) :- movies_size(Size), !.
fitfuzzy(_,Size,Size) :- dvdsize(Size), !.
fitfuzzy(DVD,大小,浪费):-
CheckSize 是大小 - 浪费,
%这感觉像是一种可怕的方式来做到这一点。我非常喜欢建议
% 关于如何使其递归或总体上更好。
( fitexact(CheckSize, 0, [], DVD)
-> 删除vd(DVD)
; NewWasted 已浪费 + 1,
write('fitfuzzy: 增加浪费的空间到'), write(NewWasted), nl,
fitfuzzy(DVD,Size,NewWasted)
)。
地位 :-
电影计数(电影左),
电影尺寸(电影尺寸),
write('剩下的电影:'), write(MoviesLeft), nl,
write('左尺寸:'), write(MoviesSize), nl.
燃烧循环:-
电影计数(C),C>0,
fitfuzzy(DVD),
地位,
写('DVD ='),打印(DVD),nl,nl,
烧环。
% movies.db 包含一个电影列表(名称,大小)。陈述。它也是
% 必须有 :- 动态(电影/2)。在顶部缩回工作。
去 :-
['movies.db'],
烧环。