scal(_, _, [], []).
scal(Lista, [H|T], Wszystkie, [(X-Y)|Wynik]) :-
wez_poz(H, Lista, (X-Y)),
select(X, Wszystkie, W2),
select(Y, W2, W3),
scal(Lista, T, W3, Wynik).
有没有人知道如何重写该谓词完全不同但工作原理相同?
wez_poz(H, List, (X-Y))
X
和Y
的{{1}}位置统一H
,Lista
是矩阵中所有位置的列表,例如wszystkie Wszystkie
为[[1, 2, 3], [2, 4, 5]]
答案 0 :(得分:1)
这对select / 3用于搜索并从Wszystkie
中提取元素,因此可以组合在一个谓词中,稍微增加一点(我推测):
scal(_, _, [], []).
scal(Lista, [H|T], Wszystkie, [(X-Y)|Wynik]) :-
wez_poz(H, Lista, (X-Y)),
find_pair(Wszystkie, X, Y, W3),
scal(Lista, T, W3, Wynik).
find_pair([X|Wszystkie], X, Y, W3) :-
!, select(Y, Wszystkie, W3).
find_pair([Y|Wszystkie], X, Y, W3) :-
!, select(X, Wszystkie, W3).
find_pair([H|Wszystkie], X, Y, [H|W3]) :-
find_pair(Wszystkie, X, Y, W3).
更好的优化可能是使用Wszystkie
的排序数据结构。例如,SWI-Prolog提供ordered sets或red black trees。使用rb_tree搜索时间将减少到O(log(N)),但您必须考虑排序和更多内存开销。