home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
MBUG
/
MBUG114.ARC
/
UNIFY.Z80
< prev
next >
Wrap
Text File
|
1979-12-31
|
7KB
|
412 lines
; ===========================================================
; UNIFY.Z80
; unify routine for E-Prolog
; June 10, 1985
.Z80
FALSE EQU 0
TRUE EQU 1
EMPTY EQU -1
UNDEF EQU -2
FROZEN EQU -3
DEBUG EQU FALSE
HT EQU 9
LF EQU 10
CR EQU 13
CTLZ EQU 26
CPM EQU 0000H
BDOS EQU CPM+0005H
CDMA EQU CPM+0080H
TPA EQU CPM+0100H
;SUBVAL
;value(v)
; SUBST * v;
; {
; SUBST * u;
;
VALUE::
PUSH HL ; v
; while (substp(v) && ((u = v->forw.val) != (SUBST *)UNDEF))
VA2: CALL SUBSTP## ; substp(v) ?
JR Z,VA1
CALL @FORW## ; u = v->forw
LD DE,UNDEF
CALL CPHL## ; u == UNDEF ?
JR Z,VA1
; {
; v = u;
POP DE ; discard
PUSH HL ; v
; }
JR VA2
VA1:
; return v;
POP HL ; v
RET
; }
;LSUBST
;vf(var,lsub)
;/* find variable */
; VARIABLE var;
; LSUBST lsub;
DSEG
VAR: DW 0
LSUB: DW 0
CSEG
; {
VF::
LD (VAR),HL
LD (LSUB),DE
; for ( ; var != (*lsub).vname ; lsub++)
EX DE,HL
VF1:
CALL @VNAME##
LD DE,(VAR)
CALL CPHL##
JR Z,VF2
;#ifdef DEBUG
IF DEBUG
; if (! varp((*lsub).vname))
CALL VARP##
JR NZ,VF3
; fatal("\r\nFaulty subststitution list.")
LD HL,VF3MSG
JP FATAL##
DSEG
VF3MSG: DB CR,LF,'Faulty substitution list.',0
CSEG
VF3:
;#endif
ENDIF
; ;
LD HL,(LSUB)
LD DE,6
ADD HL,DE
LD (LSUB),HL
JR VF1
VF2:
; return lsub;
LD HL,(LSUB)
RET
; }
; UNIFY
;
; recursive
; input:
; HL "low" expression
; DE lsubst for HL
; HL' "high" expression
; DE' lsubst for HL'
; output
; Z flag set = failure
;BOOLEAN
;unify(lowe,lows,hie,his) /* recursive */
; EXPR lowe;
; LSUBST lows;
; EXPR hie;
; LSUBST his;
; {
; EXPR lowex;
; EXPR hiex;
; SUBVAL vfl;
; SUBVAL vfh;
; LSUBST temp;
DSEG
LOWEX: DW 0
HIEX: DW 0
LOWS: DW 0
HIS: DW 0
VFL: DW 0
VFH: DW 0
CSEG
;
; lowex.list = lowe;
; hiex.list = hie; /* synonyms */
UNIFY::
LD (LOWEX),HL
LD (LOWS),DE
EXX
LD (HIEX),HL
LD (HIS),DE
IF DEBUG
PUSH HL
LD HL,UNMSG1
CALL MSG##
LD HL,(LOWEX)
LD DE,(LOWS)
CALL EPRINT##
LD HL,UNMSG2
CALL MSG##
LD HL,(HIEX)
LD DE,(HIS)
CALL EPRINT##
DSEG
UNMSG1: DB CR,LF,' ++Unify ',0
UNMSG2: DB ' with ',0
CSEG
POP HL
ENDIF
;
; if (varp(hie))
CALL VARP##
JR Z,UN1
; {
; vfh.val = value(vf(hiex.symbol,his));
LD DE,(HIS)
CALL VF
CALL VALUE
LD (VFH),HL
; if (! substp(vfh.val))
CALL SUBSTP
JR NZ,UN1
; return unify(lowe,lows,
; vfh.assgn->sexp.list,vfh.assgn->slist);
LD HL,(VFH)
CALL @SLIST##
PUSH HL
LD HL,(VFH)
CALL @EXPR
POP DE
EXX
JR UNIFY ; tail recursion
; }
;
UN1:
; if (varp(lowe))
LD HL,(LOWEX)
CALL VARP##
JP Z,UN2
; {
; vfl.val = value(vf(lowex.symbol,lows));
LD DE,(LOWS)
CALL VF
CALL VALUE
LD (VFL),HL
; if (substp(vfl.val))
CALL SUBSTP##
JP Z,UN3
; {
; if (varp(hie))
LD HL,(HIEX)
CALL VARP##
JR Z,UN4
; {
; /* both are really variables */
; if (vfh == vfl)
; return TRUE;
LD HL,(VFH)
LD DE,(VFL)
CALL CPHL##
JR Z,RETT
; if (vfl.val > vfh.val)
JR NC,UN7
; {
; temp = vfh.val;
LD HL,(VFH)
PUSH HL
; vfh.val = vfl.val;
LD HL,(VFL)
LD (VFH),HL
; vfl.val = temp;
POP HL
LD (VFL),HL
; }
UN7:
; if (vfh.val->back.val != (SUBST *)UNDEF)
LD HL,(VFH)
CALL @BACK##
LD DE,UNDEF
CALL CPHL##
JR Z,UN8
; {
; x = vfh->forw = makesexpr(vfh->vname,vfh,UNDEF)
LD HL,(VFH)
PUSH HL
CALL @VNAME##
POP DE
LD BC,UNDEF
CALL MKSEXPR##
EX DE,HL
PUSH DE
LD HL,(VFH)
CALL @LFORW##
; vfh = x->forw = makesexpr(vfh->vname,UNDEF,UNDEF)
LD HL,(VFH)
CALL @VNAME##
LD DE,UNDEF
LD C,E
LD B,D
CALL MKSEXPR##
LD (VFH),HL
EX DE,HL
POP HL
CALL @LFORW##
; }
UN8:
; vfh.val->back.val = vfl.val;
LD HL,(VFH)
LD DE,(VFL)
CALL @LBACK##
; vfl.val->forw.val = vfh.val;
LD HL,(VFL)
LD DE,(VFH)
CALL @LFORW##
; return TRUE;
RETT: LD A,1
OR A
RET
; }
;UN6 EQU UN2
UN4:
; else
; {
; vfl.val->forw.assgn = makesexpr(hie,vfl.val,his);
LD HL,(HIEX)
LD DE,(VFL)
LD BC,(HIS)
CALL MKSEXPR##
EX DE,HL
LD HL,(VFL)
CALL @LFORW##
; return TRUE;
JR RETT
; }
; }
;UN5 EQU UN2
UN3:
; else
; return unify(vfl.assgn->sexp.list,vfl.assgn->slist,
; hie,his);
LD HL,(HIEX)
LD DE,(HIS)
EXX
LD HL,(VFL)
CALL @SLIST##
PUSH HL
LD HL,(VFL)
CALL @EXPR##
POP DE
JP UNIFY ; tail recursion
; }
;
UN2:
UN5 EQU UN2
UN6 EQU UN2
; if (nelistp(lowex.list))
LD HL,(LOWEX)
CALL NELP##
JR Z,UN9
; {
; if (varp(hie))
LD HL,(HIEX)
CALL VARP##
JR Z,UN10
; {
; vfh.val->forw.assgn = makesexpr(lowe,vfh.val,lows);
LD HL,(LOWEX)
LD DE,(VFH)
LD BC,(LOWS)
CALL MKSEXPR##
EX DE,HL
LD HL,(VFH)
CALL @LFORW##
; return TRUE;
JP RETT
; }
UN10:
; else if (nelistp(hie))
LD HL,(HIEX)
CALL NELP##
JR Z,UN11
; {
; return (unify(lowex.list->left.list,lows,
; hiex.list->left.list,his) &&
; unify(lowex.list->right.list,lows,
; hiex.list->right.list,his));
LD HL,(HIEX)
PUSH HL
CALL @LEFT##
LD DE,(HIS)
PUSH DE
EXX
LD HL,(LOWEX)
PUSH HL
CALL @LEFT##
LD DE,(LOWS)
PUSH DE
CALL UNIFY ; recursion
JR Z,UN12
POP DE
POP HL
PUSH DE
CALL @RIGHT##
POP DE
EXX
POP DE
POP HL
PUSH DE
CALL @RIGHT##
POP DE
EXX
JP UNIFY ; tail recursion
; }
UN12:
POP HL
POP HL
POP HL
POP HL
UN11:
; else /* hie is symbol or number or empty */
; {
; return FALSE;
RETF:
XOR A
RET
; }
; }
UN9:
; else /* lowex is symbol or number or empty */
; {
; if (varp(hie))
LD HL,(HIEX)
CALL VARP##
JR Z,UN13
; {
; vfh.val->forw.assgn = makesexpr(lowe,vfh.val,lows);
LD HL,(LOWEX)
LD DE,(VFH)
LD BC,(LOWS)
CALL MKSEXPR##
EX DE,HL
LD HL,(VFH)
CALL @LFORW##
; return TRUE;
JP RETT
; }
UN13:
; else if (nelistp(hie))
; return FALSE;
CALL NELP
JR NZ,RETF
; else /* hie is symbol or number or empty */
; {
; return (hiex.list == lowex.list);
LD DE,(LOWEX)
CALL CPHL##
JP Z,RETT
JR RETF
; }
; }
; }
END