【问题标题】:Find minimum of various predicates找到各种谓词的最小值
【发布时间】: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 &lt;= Y). 使用回溯而不存储排列,但没有显式失败。

标签: prolog backtracking minimum


【解决方案1】:

如果我没有正确理解,我很抱歉(告诉我,以便我可以帮助你),但是,你的意思是这样的吗?

    findMinHead(X,Z):-
        findall( Y, ( permutation(X,[Y|_]) ), Z1 ),
        min_list(Z1,Z).

在这个谓词中,我们找到所有 Y 值,其中 Y 是 X 排列的头部,将所有这些值放入一个包中,然后找到最小值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2019-06-26
    • 2020-10-17
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多