找到各种谓词的最小值

时间:2017-09-29 18:00:14

标签: prolog backtracking minimum

我想找到从main谓词调用的所有排列的最小值。为简单起见,我删除了我的整个代码,假设我只想找到所有排列最少的head元素

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

1 个答案:

答案 0 :(得分:0)

对不起,如果我听不懂(告诉我,这样我可以帮助您),但是,您的意思是这样的吗?

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

在此谓词中,我们找到所有Y值,其中Y是X的排列的头,将所有这些值放在袋子中,然后找到最小值。