blob: b361b985a9a41e352cbdacc558a9d42b172096c7 [file] [log] [blame]
% 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).