| Computational Logic |
| Concurrent (Constraint) Logic Programming |
p(X):- X = a | r.
p(X):- X = b | s.
q(X):- true | X = b.
?- p(X), q(X).
| Logic | Concurrent Logic |
| shared logical variable | communication channel |
| instantiation | communication |
| head unification | synchronization |
| Logic | Concurrent Logic |
| cut | commit |
| ``don't know'' | (``don't care'' non-determinism) |
| non-determinism | indeterminism |
| search | selection |
| Logic | Concurrent Logic |
| atomic goal | process |
| goal (set of atoms) | process network |
| clause | process instruction |
?- q(X), p(X). p(X):- X=f(a,Y), check(Y). check(ok). q(f(X,Y)):- X=a | Y=ok.
?- q(X), p(more(X)). p(more(X)):- X=f(a,Y), p(Y). p(more(X)):- X=f(b,Y), p(Y). p(ok). q(f(X,Y)):- X=b | Y=more(Z), q(Z). q(f(X,Y)):- X=a | Y=ok.
?- q(A), p(A). p(A):- A=channels(X,Y,Z), p1(X), p2(Y), p3(Z). q(channels(X,Y,Z)):- q1(X), q2(Y), q3(Z).
naturals(N,Is):- Is=[N|Is1], N1 is N+1, naturals(N1,Is1).
sum([N|Is],Tmp,Sum):- N>=0 | TN is Tmp+N, sum(Is,TN,Sum).
?- naturals(0,I), sum(I,0,Total).
?- naturals(0,I), sum(I,0,Total), I=[_|_]. naturals(N,[I|Is]):- I=N, N1 is N+1, naturals(N1,Is). sum([N|Is],Tmp,Sum):- N>=0 | Is=[_|_], TN is Tmp+N, sum(Is,TN,Sum).
merge([X|Xs],Ys,Out):- Out=[X|Zs], merge(Xs,Ys,Zs). merge(Xs,[Y|Ys],Out):- Out=[Y|Zs], merge(Xs,Ys,Zs). merge([],Ys,Out):- Out=Ys. merge(Xs,[],Out):- Out=Xs.
dispatch([X|Xs],Out1,Out2):- Out1=[X|Ys], Out2=[X|Zs], dispatch(Xs,Ys,Zs). dispatch([],Out1,Out2):- Out1=[], Out2=[].
dispatch([X|Xs],Out1,Out2):- Out1=[X|Ys], dispatch(Xs,Ys,Out2). dispatch([X|Xs],Out1,Out2):- Out2=[X|Ys], dispatch(Xs,Out1,Ys). dispatch([],Out1,Out2):- Out1=[], Out2=[].
dispatch([mess(1,X)|Xs],Out1,Out2):- Out1=[X|Ys], dispatch(Xs,Ys,Out2). dispatch([mess(2,X)|Xs],Out1,Out2):- Out2=[X|Ys], dispatch(Xs,Out1,Ys). dispatch([],Out1,Out2):- Out1=[], Out2=[].
``An event that may occur will eventually occur''
merge([X|Xs],Ys,Out):- Out=[X|Zs], merge(Xs,Ys,Zs). merge(Xs,[Y|Ys],Out):- Out=[Y|Zs], merge(Xs,Ys,Zs). merge([],Ys,Out):- Out=Ys. merge(Xs,[],Out):- Out=Xs.Key: or-fairness required, otherwise it is just append!
naturals(N,Is):- | Is=[N|Is1], N1 is N+1, naturals(N1,Is1). ?- naturals(0,I), sum(I,0,Total).Key: and-fairness required, otherwise nothing is ever consumed!
?- naturals(I), sum(I,Total), I=[_|_]. naturals(I):- naturals(0,I). naturals(N,[I|Is]):- | I=N, N1 is N+1, naturals(N1,Is). sum(I,Total):- sum(I,0,Total). sum([N|Is],Tmp,Sum):- N>=0 | Is=[_|_], TN is Tmp+N, sum(Is,TN,Sum).
?- q(X), p(X). p(more(X)):- X=f(a,Y), p(Y). p(more(X)):- X=f(b,Y), p(Y). p(ok). q(f(X,Y)):- X=b | Y=more(Z), q(Z). q(f(X,Y)):- X=a | Y=ok.
?- naturals(0,I), sum(I,0,Total), I=[_1,_2,_3,_4]. naturals(N,[I|Is]):- | I=N, N1 is N+1, naturals(N1,Is). naturals(N,[]). sum([N|Is],Tmp,Sum):- N>=0 | TN is Tmp+N,sum(Is,TN,Sum). sum([],Tmp,Sum):- | Sum=Tmp.Key: the communication media is produced from outside and fixed size!
?- naturals(0,I), sum(I,0,Total), medium(4,I). medium(0,Stream) :- Stream = []. medium(N,Stream):- N>0 |Stream=[_|Stream1], medium(N-1,Stream1).
buffer(0,Stream,Tail):- Stream=Tail. buffer(N,Stream,Tail):- N>0 | Stream=[_|Stream1], buffer(N-1,Stream1,Tail).Creates buffer as open list of N elements, passes handle to list end
naturals(N,[I|Is],Max):- N<=Max | I=N, N1 is N+1, naturals(N1,Is,Max). naturals(N,I,Max):- N>Max | I=[].Suspended until buffer available. Closes buffer at Max elements
sum([N|Is],Tail,Acc,Sum):- N>=0 |
Tail=[_|Tail1], NAcc is Acc+N, sum(Is,Tail1,NAcc,Sum).
sum([],Tail,Acc,Sum) :- Acc = Sum.
Suspended until buffer and element available.
Adds one more element to the buffer for each element consumed.
?- naturals(0,Buffer,1000), sum(Buffer,Tail,0,Total), buffer(18,Buffer,Tail).
?- vector(V), matrix(M), vm(V,M,Result).
vm(_,[],Zv):- Zv=[].
vm(Xv,[Yv|Ym],Zv):- Zv=[Z|Zv1],
vv(Xv,Yv,Z),
vm(Xv,Ym,Zv1).
vv(Xv,Yv,P):- vv1(Xv,Yv,0,P).
vv1([],[],S,P):- P=S.
vv1([X|Xv],[Y|Yv],S,P):- S1 is S+X*Y |
vv1(Xv,Yv,S1,P).
queue([dequeue(X)|S],Head,Tail):-
Head=[X|NewHead],
queue(S,NewHead,Tail).
queue([enqueue(X)|S],Head,Tail):-
Tail=[X|NewTail],
queue(S,Head,NewTail).
queue([],_,_).
?- processors(10,Job), Job=...
processors(N,X):-
queue(S,[X|Xs],Xs),
processors(1,N,S).
processors(N,N,S):-
processor(N,idle,S).
processors(N1,N4,S):-
N2 is (N1+N4)/2 | N3 is N2+1,
processors(N1,N2,S1),
processors(N3,N4,S2),
merge(S1,S2,S).
?- consumers(Buffer), producers(Buffer).
producers(Stream):- p1(X), p2(Y), p3(Z),
merge(X,Y,Stream1), merge(Z,Stream1,Stream).
consumers(Stream):- c1(Stream), c2(Stream), c3(Stream).
p1(S):- S=[message(1,Mess)|Xs], produce(Mess), p1(Xs).
p1(S):- S=[].
c1([X|Xs]):- X=message(1,Mess) | consume(Mess), c1(Xs).
c1([X|Xs]):- X=message(Id,Mess), Id=\=1 | c1(Xs).
c1([]).