| % generated: 19 June 1990 |
| % option(s): |
| % |
| % browse |
| % |
| % Tep Dobry (from Lisp version by R. P. Gabriel) |
| % |
| % (modified January 1987 by Herve' Touati) |
| |
| main :- |
| 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) :- |
| 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). |