/* Browse benchmark in Picat v3. From bench/browse.pl https://github.com/SWI-Prolog/bench Changes: - adding $ to second argument of investigate/2 - adding $ to $[pattern(Ppats)|L],Symb), - adding $ to $star[..] - changed length/2 to bp.length/2 This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ main => go. go :- init(100,10,4, [[a,a,a,b,b,b,b,a,a,a,a,a,b,b,a,a,a], [a,a,b,b,b,b,a,a,[a,a],[b,b]], [a,a,a,b,[b,a],b,a,b,a] ], Symbols), randomize(Symbols,RSymbols,21),!, investigate(RSymbols, $[[star(SA),B,star(SB),B,a,star(SA),a,star(SB),star(SA)], [star(SA),star(SB),star(SB),star(SA),[star(SA)],[star(SB)]], [_,_,star(_),[b,a],star(_),_,_] ]), foreach(R in RSymbols) println(R) end, nl. go. % """ % generated: 19 June 1990 % option(s): % % browse % % Tep Dobry (from Lisp version by R. P. Gabriel) % % (modified January 1987 by Herve' Touati) % """ top :- init(100,10,4, [[a,a,a,b,b,b,b,a,a,a,a,a,b,b,a,a,a], [a,a,b,b,b,b,a,a,[a,a],[b,b]], [a,a,a,b,[b,a],b,a,b,a] ], Symbols), randomize(Symbols,RSymbols,21),!, investigate(RSymbols, $[[star(SA),B,star(SB),B,a,star(SA),a,star(SB),star(SA)], [star(SA),star(SB),star(SB),star(SA),[star(SA)],[star(SB)]], [_,_,star(_),[b,a],star(_),_,_] ]). init(N,M,Npats,Ipats,Result) :- init(N,M,M,Npats,Ipats,Result). init(0,_,_,_,_,_) :- !. init(N,I,M,Npats,Ipats,[Symb|Rest]) :- fill(I,[],L), get_pats(Npats,Ipats,Ppats), J is M - I, fill(J,$[pattern(Ppats)|L],Symb), N1 is N - 1, (I =:= 0 -> I1 is M; I1 is I - 1), init(N1,I1,M,Npats,Ipats,Rest). fill(0,L,L) :- !. fill(N,L,[dummy([])|Rest]) :- N1 is N - 1, fill(N1,L,Rest). randomize([],[],_) :- !. randomize(In,[X|Out],Rand) :- bp.length(In,Lin), Rand1 is (Rand * 17) mod 251, N is Rand1 mod Lin, split(N,In,X,In1), randomize(In1,Out,Rand1). split(0,[X|Xs],X,Xs) :- !. split(N,[X|Xs],RemovedElt,[X|Ys]) :- N1 is N - 1, split(N1,Xs,RemovedElt,Ys). investigate([],_) :- !. investigate([U|Units],Patterns) :- property(U,pattern,Data), p_investigate(Data,Patterns), investigate(Units,Patterns). get_pats(Npats,Ipats,Result) :- get_pats(Npats,Ipats,Result,Ipats). get_pats(0,_,[],_) :- !. get_pats(N,[X|Xs],[X|Ys],Ipats) :- N1 is N - 1, get_pats(N1,Xs,Ys,Ipats). get_pats(N,[],Ys,Ipats) :- get_pats(N,Ipats,Ys,Ipats). property([],_,_) :- fail. /* don't really need this */ property([Prop|_],P,Val) :- functor(Prop,P,_),!, arg(1,Prop,Val). property([_|RProps],P,Val) :- property(RProps,P,Val). p_investigate([],_). p_investigate([D|Data],Patterns) :- p_match(Patterns,D), p_investigate(Data,Patterns). p_match([],_). p_match([P|Patterns],D) :- (match(D,P),fail; true), p_match(Patterns,D). match([],[]) :- !. match([X|PRest],[Y|SRest]) :- var(Y),!,X = Y, match(PRest,SRest). match(List,[Y|Rest]) :- nonvar(Y),Y = $star(X),!, '$concat'(X,SRest,List), match(SRest,Rest). match([X|PRest],[Y|SRest]) :- (atom(X) -> X = Y; match(X,Y)), match(PRest,SRest). '$concat'([],L,L). '$concat'([X|L1],L2,[X|L3]) :- '$concat'(L1,L2,L3).