- library
- clp
- clpfd.pl -- CLP(FD): Constraint Logic Programming over Finite Domains
- in/2
- ins/2
- indomain/1
- label/1
- labeling/2
- all_different/1
- all_distinct/1
- sum/3
- scalar_product/4
- #>=/2
- #=</2
- #=/2
- #\=/2
- #>/2
- #</2
- #\/1
- #<==>/2
- #==>/2
- #<==/2
- #/\/2
- #\//2
- #\/2
- lex_chain/1
- tuples_in/2
- serialized/2
- element/3
- global_cardinality/2
- global_cardinality/3
- circuit/1
- cumulative/1
- cumulative/2
- disjoint2/1
- automaton/3
- automaton/8
- transpose/2
- zcompare/3
- chain/2
- fd_var/1
- fd_inf/2
- fd_sup/2
- fd_size/2
- fd_dom/2
- clpb.pl -- CLP(B): Constraint Logic Programming over Boolean Variables
- clpfd.pl -- CLP(FD): Constraint Logic Programming over Finite Domains
- clp
- transpose(+Matrix, ?Transpose)
- Transpose a list of lists of the same length. Example:
?- transpose([[1,2,3],[4,5,6],[7,8,9]], Ts). Ts = [[1, 4, 7], [2, 5, 8], [3, 6, 9]].
This predicate is useful in many constraint programs. Consider for instance Sudoku:
sudoku(Rows) :- length(Rows, 9), maplist(same_length(Rows), Rows), append(Rows, Vs), Vs ins 1..9, maplist(all_distinct, Rows), transpose(Rows, Columns), maplist(all_distinct, Columns), Rows = [As,Bs,Cs,Ds,Es,Fs,Gs,Hs,Is], blocks(As, Bs, Cs), blocks(Ds, Es, Fs), blocks(Gs, Hs, Is). blocks([], [], []). blocks([N1,N2,N3|Ns1], [N4,N5,N6|Ns2], [N7,N8,N9|Ns3]) :- all_distinct([N1,N2,N3,N4,N5,N6,N7,N8,N9]), blocks(Ns1, Ns2, Ns3). problem(1, [[_,_,_,_,_,_,_,_,_], [_,_,_,_,_,3,_,8,5], [_,_,1,_,2,_,_,_,_], [_,_,_,5,_,7,_,_,_], [_,_,4,_,_,_,1,_,_], [_,9,_,_,_,_,_,_,_], [5,_,_,_,_,_,_,7,3], [_,_,2,_,1,_,_,_,_], [_,_,_,_,4,_,_,_,9]]).
Sample query:
?- problem(1, Rows), sudoku(Rows), maplist(portray_clause, Rows). [9, 8, 7, 6, 5, 4, 3, 2, 1]. [2, 4, 6, 1, 7, 3, 9, 8, 5]. [3, 5, 1, 9, 2, 8, 7, 4, 6]. [1, 2, 8, 5, 3, 7, 6, 9, 4]. [6, 3, 4, 8, 9, 2, 1, 5, 7]. [7, 9, 5, 4, 6, 1, 8, 3, 2]. [5, 1, 9, 2, 8, 6, 4, 7, 3]. [4, 7, 2, 3, 1, 9, 5, 6, 8]. [8, 6, 3, 7, 4, 5, 2, 1, 9]. Rows = [[9, 8, 7, 6, 5, 4, 3, 2|...], ... , [...|...]].