【发布时间】:2018-03-11 16:43:48
【问题描述】:
我想找到从main 谓词调用的所有排列的最小值。为简单起见,我删除了整个代码,假设我只想找到所有排列的头部元素的最小值。
appendlist([], X, X).
appendlist([T|H], X, [T|L]) :- appendlist(H, X, L).
permutation([], []).
permutation([X], [X]) :-!.
permutation([T|H], X) :- permutation(H, H1), appendlist(L1, L2, H1), appendlist(L1, [T], X1), appendlist(X1, L2, X).
%min(X, A, B) X is the minimum of A, B
min(X, X, Y) :- X =< Y.
min(Y, X, Y) :- Y < X.
solve([Head|Rest], Head):-
writeln([Head|Rest]).
main :-
Sort = [1, 2, 3],
PrvAns is 1000,
permutation(Sort, X),
solve(X, Here),
min(Ans, Here, PrvAns),
writeln(Ans),
PrvAns = Ans,
!, fail;
true,
writeln(PrvAns).
我想计算每个排列的最小值。现在,permute 工作正常,你可以看到 solve 打印了所有的排列,甚至正确地返回了第一个值 Head,但是 PrvAns = Ans 是错误的。
预期输出 PrvAns : 1
【问题讨论】:
-
main() :-语法无效,仅供参考。 -
没有括号的
!, fail; true在我看来很可疑。;的优先级往往会让人绊倒,我会尝试在main/0中更明确地用括号括起来。 -
链接的问题是否也回答了这个问题?我问是因为为了找到不回溯的最小值,我认为需要存储排列,而在其他问题中,非回溯工作正常......
-
@coder 还有另一种方式,也就是说,如果 L 中没有 Y 使得 Y forall/2,这可能不是教授的意图:
min(X, List) :- member(X, List), forall(member(Y, List), X <= Y).使用回溯而不存储排列,但没有显式失败。
标签: prolog backtracking minimum