File: qlay.kl1

package info (click to toggle)
klic 3.003-1.1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 7,068 kB
  • ctags: 6,333
  • sloc: ansic: 101,584; makefile: 3,395; sh: 1,321; perl: 312; exp: 131; tcl: 111; asm: 102; lisp: 4; sed: 1
file content (59 lines) | stat: -rw-r--r-- 1,690 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
% N-Queens using layered-streams
% by A. Okimura
% (ICOT TR-421, p.119, 1988)

:- module main.

main:-true|
	klicio:klicio([stdout(Res)]),
	check_stream(Res).

check_stream(normal(S)) :-
	go(8,N),
	S = [putt(N),nl].
check_stream(abnormal).

go(M,N) :- true | queen(1,M,begin,A), count(A,N).

count(L,N) :- true | count(L,0,N).
count([X|Xs],M,N) :- M1 := M+1 | count(Xs,M1,N).
count([],M,N) :- true | M = N.

queen(I,N,In,Out) :- I < N, I1 := I+1 |
	q(1,N,In,Mid),
	queen(I1,N,Mid,Out).
queen(N,N,In,Out) :- true | lastQ(1,N,In,Out).

q(I,N,In,Out) :- I =< N, I1 := I+1 |
	filter(In,I,1,Out1),
	q(I1,N,In,Outs),
	Out=[[I|Out1]|Outs].
q(I,N,_,Out) :- I > N | Out = [].

lastQ(I,N,In,Out) :- I =< N, I1 := I+1 |
	lastFilter([I],In,I,1,Out,Out1),
	lastQ(I1,N,In,Out1).
lastQ(I,N,_,Out) :- I > N | Out = [].

filter(begin,_,_,Out) :- true | Out = begin.
filter([],_,_,Out) :- true | Out = [].
filter([[I|_]|Ins],I,D,Out) :- true | filter(Ins,I,D,Out).
filter([[J|_]|Ins],I,D,Out) :- D =:= I-J | filter(Ins,I,D,Out).
filter([[J|_]|Ins],I,D,Out) :- D =:= J-I | filter(Ins,I,D,Out).
otherwise.
filter([[J|In1]|Ins],I,D,Out) :- D1 := D+1 |
	filter(In1,I,D1,Out1),
	filter(Ins,I,D,Outs),
	Out = [[J|Out1]|Outs].

lastFilter(Stack,begin,_,_,S,T) :- true | S = [Stack|T].
lastFilter(Stack,[],_,_,S,T) :- true | S = T.
lastFilter(Stack,[[I|_]|Ins],I,D,S,T) :- true | lastFilter(Stack,Ins,I,D,S,T).
lastFilter(Stack,[[J|_]|Ins],I,D,S,T) :- D =:= I-J |
	lastFilter(Stack,Ins,I,D,S,T).
lastFilter(Stack,[[J|_]|Ins],I,D,S,T) :- D =:= J-I |
	lastFilter(Stack,Ins,I,D,S,T).
otherwise.
lastFilter(Stack,[[J|In]|Ins],I,D,S,T) :- D1 := D+1 |
	lastFilter([J|Stack],In,I,D1,S,SS),
	lastFilter(Stack,Ins,I,D,SS,T).