home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-05-18 | 5.7 KB | 137 lines | [TEXT/MSBB] |
- 'copyright 1994 by Stephen Boerner, eye systems-
- 'CIS-74203,2217 AOL-ISISINC BMUG, INTERNET EYESYS@CRL.COM
- 'MAY NOT BE USED FOR COMMERCIAL GAIN
-
- REM a PROLOG COMPILER - navigate to program of prodatall, turn trace on with space,return
- REM and enter interactive prolog interpreter
- REM exit by selecting cancel from files$ dialog
- REM lowercase only
-
- DEFINT a-z:WIDTH 65:P1=100:p2=90:p3=30:tr$(0)="off":tr$(1)="on":trace=0
- REM p1 IS #vars p2 IS #stmts p3 IS #(((s
- DIM SHARED v$(100),s(2000),sn(100),ln(100),q(90),K(90),kb(100),z(30),zx(30),w(100),s1(100),s2(100)
- BEG:sn(1)=2:N=0:nv=4:ns=2:m=-1:FOR kk=1 TO nv:kb(kk)=0:NEXT:CALL pk0(N,ns,nv)
- goal:LINE INPUT " >";a$:IF a$="" THEN BEG
- IF LEFT$(a$,1)=" " THEN trace=1-trace:PRINT "trace ";tr$(trace);:GOTO goal
- N=N+1:m=N:CALL pack(a$,N,ns,nv):s(ns)=0
- BK0:K(N)=kb(s(sn(N)))
- BK:I=sn(N):si=s(I):in=ln(N):f=0:IF si=4 THEN N=nn:GOTO BT
- FOR K=K(N) TO m:j=sn(K):IF si<>s(j) OR K=0 THEN BT
- jn=ln(K):nz=0:CALL unify((I),(in),(j),(jn),nq,f,N,nv,nz):IF f=1 THEN AN
- BN:NEXT K:GOTO BT
- AN:ns0=ns:K(N)=K+1:IF trace=1 THEN CALL prnt(nq,N,K)
- IF si=3 THEN CALL prt2(I,in)
- CALL copy(jn,ns,nq,N,nv,nz):CALL copy(in,ns,nq,N,nv,nz)
- N=N+1:sn(N)=ns0:CALL SKIP(ns0,lnn):ln(N)=lnn:s(ns)=0:ns=ns+1
- IF K(K)=-1 THEN nn=N-1:IF trace=1 THEN PRINT"CUT";
- IF ns0<ns-1 THEN BK0
- BT:IF trace=1 THEN IF f=0 THEN PRINT "FAIL"; ELSE PRINT "SUC";
- IF trace=0 THEN IF f=1 THEN PRINT TAB(57);"(yes)"
- N=N-1:ns=sn(N+1):IF N<m THEN GOTO goal ELSE GOTO BK
- SUB unify(I,in,j,jn,nq,f,N,nv,nz) STATIC
- nq=0:n2=0:IF fir=0 THEN fir=1:z0=0:z1=1
- UN:IF z0=1 THEN GOSUB SW
- IF I=in AND j=jn AND n2=0 THEN f=1:EXIT SUB
- IF I=in AND n2>0 THEN n2=n2-2:I=w(n2):in=w(n2+1):GOTO UN
- IF j=jn AND n2>0 THEN n2=n2-2:j=w(n2):jn=w(n2+1):GOTO UN
- V2:IF s(I)>=0 THEN IF s(j)<0 THEN GOSUB SW ELSE U2
- sk=s(I):GOSUB zz:FOR kk=0 TO nq-1 STEP 3:IF sk<>s(q(kk+z0)) THEN NK ELSE w(n2)=I+1
- w(n2+1)=in:I=q(kk+z1):GOSUB SKI:n2=n2+2:IF n2>99 THEN PRINT "occur check":EXIT SUB ELSE UN
- NK:NEXT kk:q(nq+z0)=I:q(nq+z1)=j:I=I+1:GOSUB SKJ:q(nq+2)=j:nq=nq+3:GOTO UN
- U2:IF s(I)=s(j) THEN I=I+1:j=j+1:GOTO UN ELSE EXIT SUB
- zz:FOR kz=1 TO nz:IF z(kz)<>sk THEN NEXT kz:nz=nz+1:z(nz)=sk:zx(nz)=z0:RETURN
- IF zx(kz)=z0 THEN RETURN ELSE t$="_"+v$(-sk)+HEX$(N):FOR jk=0 TO nv
- IF v$(jk)=t$ THEN sk=-jk ELSE NEXT jk:nv=nv+1:v$(nv)=t$:sk=-nv:RETURN
- RETURN
- SW:SWAP I,j:SWAP in,jn:SWAP z0,z1:RETURN
- SKI:in=I+1:IF s(in)<>1 THEN RETURN ELSE l=0
- SKI2:IF s(in)=2 THEN l=l+1 ELSE IF s(in)=1 THEN l=l-1
- in=in+1:IF l=0 THEN RETURN ELSE SKI2
- SKJ:j=j+1:IF s(j)<>1 THEN RETURN ELSE l=0
- SKJ2:IF s(j)=2 THEN l=l+1 ELSE IF s(j)=1 THEN l=l-1
- j=j+1:IF l=0 THEN RETURN ELSE SKJ2
- END SUB
- SUB SKIP(hh,H) STATIC:H=hh+1
- IF s(H)<>1 THEN EXIT SUB ELSE l=0
- SK2:IF s(H)=2 THEN l=l+1 ELSE IF s(H)=1 THEN l=l-1
- H=H+1:IF l=0 THEN EXIT SUB ELSE SK2
- END SUB
- SUB copy(kn,ns,nq,N,nv,nz) STATIC
- IF fir=0 THEN fir=1:z=0
- z=1-z:nw=0:kk=kn:WHILE s(kk)<>0:sk=s(kk)
- IF sk>0 THEN s(ns)=sk:ns=ns+1 ELSE GOSUB t
- kk=kk+1:WEND:EXIT SUB
- t:FOR kl=0 TO nq-1 STEP 3:IF (sk<>s(q(kl+z))) THEN tx
- IF z=1 AND s(q(kl))<0 THEN tx
- qk=q(kl+2):km=q(kl+1-z):WHILE km<qk:w(nw)=qk:w(nw+1)=km:nw=nw+2
- z=1-z:sk=s(km):IF sk>0 THEN s(ns)=sk:ns=ns+1 ELSE GOSUB t
- z=1-z:nw=nw-2:qk=w(nw):km=w(nw+1)+1:WEND:RETURN
- tx:NEXT kl:GOSUB zzz:s(ns)=sk:ns=ns+1:RETURN
- zzz:FOR kz=1 TO nz:IF z(kz)<>sk THEN NEXT kz:nz=nz+1:z(nz)=sk:zx(nz)=z:RETURN
- IF zx(kz)=z THEN RETURN ELSE t$="_"+v$(-sk)+HEX$(N):FOR j=0 TO nv
- IF v$(j)=t$ THEN sk=-j ELSE NEXT j:nv=nv+1:v$(nv)=t$:sk=-nv
- RETURN:END SUB
- SUB prt2(b,e) STATIC:PRINT " ";
- FOR kk=b+2 TO e-2:PRINT v$(ABS(s(kk)));
- NEXT kk:EXIT SUB:END SUB
- SUB prnt(nq,N,K) STATIC
- PRINT TAB(2);N;:CALL prt(sn(N))
- PRINT TAB(20);:FOR kk=0 TO nq-1 STEP 3:sq=s(q(kk))
- IF sq<=0 THEN PRINT v$(ABS(sq));"=";:CALL prt3(q(kk+1),q(kk+2)-1):PRINT "|";
- IF sq>0 THEN CALL prt3(q(kk),q(kk+2)-1):PRINT "=";v$(ABS(s(q(kk+1))));"|";
- NEXT kk:PRINT TAB(32);K;TAB(36);:CALL prt(sn(K)):EXIT SUB
- END SUB
- SUB prt3(b,e) STATIC:FOR kk=b TO e:PRINT v$(ABS(s(kk)));
- IF ABS(s(kk+1))>2 AND s(kk)<>1 AND kk<>e THEN PRINT ",";
- NEXT kk:EXIT SUB
- END SUB
- SUB prt(b) STATIC:kk=b:WHILE s(kk)<>0:PRINT v$(ABS(s(kk)));
- IF ABS(s(kk+1))>2 AND s(kk)<>1 AND s(kk+1)<>0 THEN PRINT ",";
- kk=kk+1:WEND:EXIT SUB
- END SUB
- SUB pk0(N,ns,nv) STATIC:P1=100:p=1
- CLS:f$=FILES$(1,"TEXT"):OPEN f$ FOR INPUT AS #1:LOCATE 3,1
- bb:WHILE NOT EOF(1):LINE INPUT #1,a$:IF a$<>"" THEN v$(P1-p)=a$:p=p+1
- WEND:CLOSE#1:RESTORE 1000
- READ a$:WHILE a$<>"":v$(P1-p)=a$:p=p+1:READ a$:WEND
- FOR k1=1 TO p-1:w$=v$(P1-k1):GOSUB ins:x$=s$
- WHILE x$=s$:k1=k1+1:w$=v$(P1-k1):GOSUB ins:WEND:k1=k1-1
- FOR k2=k1+1 TO p-1:w$=v$(P1-k2):GOSUB ins
- IF s$=x$ THEN GOSUB swt
- NEXT k2,k1
- FOR kk=1 TO p-1:a$=v$(P1-kk):PRINT TAB(2);N+1;a$
- N=N+1:CALL pack(a$,N,ns,nv):NEXT kk:EXIT SUB
- ins:j=LEN(w$):j1=INSTR(w$,"|"):IF j1>1 THEN j=j1-1
- j1=INSTR(w$,"("):IF j1>1 AND j1<j THEN j=j1-1
- s$=LEFT$(w$,j):RETURN
- swt:FOR k3=k2 TO k1+2 STEP -1
- v$(P1-k3)=v$(P1-k3+1):NEXT k3:v$(P1-k1-1)=w$:k1=k1+1:RETURN
- 1000 DATA "eq(X,X)"
- DATA "list(A)"
- DATA "?(A,B)"
- DATA "not(X)|X,!,fail"
- DATA "not(X)"
- DATA ""
- END SUB
- REM takes an array a(N) and sorts it
- SUB pack(a$,N,ns,nv) STATIC:P1=100:l=0:ln(N)=0:K(N)=0:fv=0:ns0=ns
- IF fir=0 THEN fir=1:v$(0)="@":v$(1)="(":v$(2)=")":v$(3)="?":v$(4)="!":
- a$=a$+"|)))":la=LEN(a$):FOR I=1 TO la:c$=MID$(a$,I,1):IF c$="!" THEN K(N)=-1
- IF c$="(" OR c$=")" OR c$="," OR c$="|" OR c$=" " THEN pk2
- t$=t$+c$:GOTO n2
- pk2:IF t$<>"" THEN z$=LEFT$(t$,1):tz=1
- IF t$<>"" AND z$>="A" AND z$<="Z" AND c$<>"(" THEN tz=-1
- IF t$<>"" THEN GOSUB a
- IF c$="(" THEN s1(l)=K:l=l+1:s(ns)=1:ns=ns+1
- IF c$=")" THEN l=l-1:IF l<0 THEN n3 ELSE s(ns)=2:ns=ns+1
- IF c$="|" AND (I<>la-3 OR ln(N)=0) THEN ln(N)=ns
- n2:NEXT I
- a:FOR j=0 TO nv:IF v$(j)=t$ THEN K=j ELSE NEXT j:nv=nv+1:v$(nv)=t$:K=nv
- IF kb(K)=0 AND ns=ns0 THEN kb(K)=N
- s(ns)=K*tz:ns=ns+1:t$="":s2(l)=s2(l)+1:RETURN
- n3:s(ns)=0:ns=ns+1:sn(N+1)=ns
- IF I<>la-2 THEN PRINT "unbalanced ";a$
- EXIT SUB:END SUB
-
-
-