prolog中的矩阵链乘法

时间:2015-03-17 12:21:05

标签: prolog

我有以下矩阵乘法问题的解决方案。

matMul([X], os(0, X)).
matMul(L, os(A, m(a, d(D1, D2)))) :-
     append([L1|L1s], [L2|L2s], L),
     matMul([L1|L1s], os(A1, m(_, d(D1, C1)))),
     matMul([L2|L2s], os(A2, m(_, d(_, D2)))),
     A is A1 + A2 + (D1 * C1 * D2).

这个程序为我提供了所有可能的解决方案。

?- matMul([m(a,d(5,4)), m(a,d(4,6)), m(a,d(6,2)), m(a,d(2,7))], A).
A = os(392, m(a, d(5, 7))) ;
A = os(244, m(a, d(5, 7))) ;
A = os(414, m(a, d(5, 7))) ;
**A = os(158, m(a, d(5, 7))) ;**
A = os(250, m(a, d(5, 7))) ;
false.

我们可以看到,其中一个是最佳的。 我想要做的就是修改这个,让一​​个解决方案成为最佳解决方案。

如果有人可以提供任何指针/建议来实现它,那将非常有用。

感谢。

1 个答案:

答案 0 :(得分:1)

快速执行此操作的方法是使用setof/3,因为它按升序排序:

optimum_solution(Matrix, A) :-
    setof(os(X,M), matMul(Matrix, os(X,M)), S),
    S = [A|_].   % Select the first element, which has lowest X

setof/3在进行排序时会使用standard ordering of terms

然后将其查询为:

| ?- optimum_solution([m(a,d(5,4)), m(a,d(4,6)), m(a,d(6,2)), m(a,d(2,7))], A).

A = os(158,m(a,d(5,7)))

yes