Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ait-Kaci H.Warren's abstract machine.A tutorial reconstruction.1999

.pdf
Скачиваний:
16
Добавлен:
23.08.2013
Размер:
516.91 Кб
Скачать

WARRENS ABSTRACT MACHINE

and one among the potentially many rules whose head to unify with this atom. In any case, SLD resolution is sound (i.e., it does not derive wrong solutions) and, provided these choices are made by a fair non-deterministic selection function, it is also complete (i.e., it derives all solutions).

Prolog’s computation rule is a particular deterministic approximation of SLD resolution. Specifically, it is a flattening of SLD resolution emulating a depth-first search. It sees a program as an ordered set of definite clauses, and a query or definite clause body as an ordered set of atoms. These orders are meant to provide a rigid guide for the two choices made by the selection function of SLD resolution. Thus, Prolog’s particular computation strategy transforms a query by rewriting the query attempting to unify its leftmost atom with the head of the first rule according to the order in which they are specified. If failure is encountered, a backtracking step to the latest rule choice point is made, and computation resumed there with the next alternative given by the following rule. For example, if the two clauses for predicate conc are given as above, then the Prolog query ‘?- conc(1:2:T 3:4:[] ):’ succeeds with the substitution T = [] = 1:2:3:4:[], while the query ‘?- conc(1:2:[] 3:Y ):’ fails.

Strategies for choice of where to apply linear resolution are all logically consistent in the sense that if computation terminates, the variable binding exhibited is a legitimate solution to the original query. In particular, like non-deterministic SLD resolution, Prolog resolution is sound. However, unlike non-deterministic SLD resolution, it is incomplete. Indeed, Prolog’s particular strategy of doing linear resolution may diverge although finitely derivable solutions to a query may exist. For example, if the definite clauses for conc are given in a different order (i.e., first the rule, then the fact), then the query ‘?- conc(X Y Z ):’ never terminates although it has (infinitely many) finitely derivable solutions!

PAGE 96 OF 129

Reprinted from MIT Press Copyright c Hassan A¨IT-KACI

Appendix B

The WAM at a glance

B.1 WAM instructions

We summarize here for quick reference all the instructions of the WAM. In some instructions, we use the notation Vn to denote a variable that may be indifferently temporary or permanent.

97

WARRENS ABSTRACT MACHINE

The complete set:

Put instructions

put variable Xn Ai put variable Yn Ai put value Vn Ai

put unsafe value Yn Ai put structure f Ai put list Ai

put constant c Ai

Set instructions

set variable Vn set value Vn

set local value Vn set constant c set void n

Control instructions

allocate deallocate call P N execute P proceed

Indexing instructions

switch on term V C L S switch on constant N T switch on structure N T

Get instructions

get variable Vn Ai get value Vn Ai get structure f Ai get list Ai

get constant c Ai

Unify instructions

unify variable Vn unify value Vn unify local value Vn unify constant c unify void n

Choice instructions

try me else L retry me else L trust me

try L retry L trust L

Cut instructions

neck cut get level Yn cut Yn

PAGE 98 OF 129

Reprinted from MIT Press Copyright c Hassan A¨IT-KACI

A TUTORIAL RECONSTRUCTION

Put instructions

put variable Xn Ai

Push a new unbound REF cell onto the

HEAP[H]

h REF H i

heap and copy it into both register Xn

Xn

HEAP[H]

 

 

 

and register Ai. Continue execution with

Ai

HEAP[H]

 

 

 

the following instruction.

H

H + 1

 

 

 

 

 

 

 

 

 

 

 

 

P

P + instruction

 

size(P)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

put

 

variable Yn Ai

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Initialize the n-th stack variable in the

addr

E + n + 1

current environment to ‘unbound’ and

STACK[addr ]

h REF addr i

let Ai point to it. Continue execution

Ai

STACK[addr ]

with the following instruction.

P

P + instruction

 

size(P)

 

 

 

 

 

 

 

 

 

 

 

put

 

value Vn Ai

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Place the contents of Vn into register Ai.

Ai

Vn

 

 

 

 

Continue execution with the following

P

P + instruction

 

size(P)

instruction.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

put

 

unsafe

 

value Yn Ai

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

If the dereferenced value of Yn is not an

addr

deref (E + n + 1)

unbound stack variable in the current en-

if addr < E

 

 

 

vironment, set Ai to that value. Other-

then Ai

STORE[addr ]

wise, bind the referenced stack variable

else

 

 

 

 

to a new unbound variable cell pushed

begin

 

 

 

 

on the heap, and set Ai to point to that

 

HEAP[H]

 

h REF H i

cell. Continue execution with the fol-

 

bind(addr H)

lowing instruction.

 

Ai

HEAP[H]

 

 

 

 

 

 

 

 

 

H

H + 1

 

 

 

 

 

 

 

 

 

 

 

end

 

 

 

 

 

 

 

 

 

 

 

 

P

P + instruction

 

size(P)

Copyright c Hassan A¨IT-KACI Reprinted from MIT Press

PAGE 99 OF 129

 

 

 

 

 

 

 

 

 

WARRENS ABSTRACT MACHINE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

put

 

structure f Ai

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Push a new functor cell containing f

HEAP[H] f=n

 

onto the heap and set register Ai to an

Ai

h STR H i

 

STR cell pointing to that functor cell.

H

H + 1

 

Continue execution with the following

P

P + instruction

 

size(P)

 

instruction.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

put

 

list Ai

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Set register Ai to contain a LIS cell

Ai

h LIS H i

 

pointing to the current top of the heap.

P

P + instruction

 

size(P)

 

Continue execution with the following

 

 

 

 

 

instruction.

 

 

 

 

 

 

 

 

 

 

 

 

 

put

 

constant c Ai

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Place a constant cell containing c into

Ai

h CON c i

 

register Ai. Continue execution with the

P

P + instruction

 

size(P)

 

following instruction.

 

 

 

 

Get instructions

get

 

variable Vn Ai

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Place the contents of register Ai into

Vn

Ai

variable Vn. Continue execution with

P

P + instruction

 

size(P)

the following instruction.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

get

 

value Vn Ai

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Unify variable Vn and register Ai.

unify(Vn Ai)

Backtrack on failure, otherwise con-

if fail

 

 

 

 

 

tinue execution with following in-

then backtrack

struction.

else P P + instruction

 

size(P)

PAGE 100 OF 129

Reprinted from MIT Press Copyright c Hassan A¨IT-KACI

A TUTORIAL RECONSTRUCTION

get structure f Ai

If the dereferenced value of register Ai is an unbound variable, then bind that variable to a new STR cell pointing to f pushed on the heap and set mode to write; otherwise, if it is a STR cell pointing to functor f, then set register S to the heap address following that functor cell’s and set mode to read. If it is not a STR cell or if the functor is different than f, fail. Backtrack on failure, otherwise continue execution with following instruction.

get list Ai

addr deref (Ai)

 

 

 

case STORE[addr ] of

 

 

h REF

 

i :

HEAP[H]

h STR H + 1 i

 

 

 

HEAP[H + 1] f

 

 

 

bind(addr H)

 

 

 

H

H + 2

 

 

 

 

mode

write

h STR a i : if HEAP[a] = f

 

 

 

then

 

 

 

 

 

 

begin

 

 

 

 

 

S

a + 1

 

 

 

 

mode

read

 

 

 

 

end

 

 

 

 

 

else fail

true

other

:

fail

true

 

endcase

 

 

 

 

 

 

if fail

then backtrack

else P P + instruction size(P)

If the dereferenced value

addr deref (Ai)

 

 

 

 

of register Ai is an un-

case STORE[addr ] of

bound variable, then bind

h REF

 

i :

HEAP[H] h LIS H + 1 i

that variable to a new LIS

 

 

 

bind(addr H)

cell pushed on the heap

 

 

 

H

H + 1

and set mode to write;

 

 

 

mode

write

otherwise, if it is a LIS

h LIS a i :

S

a

 

 

 

cell, then set register S to

 

 

 

mode

read

the heap address it con-

other

:

fail

 

true

tains and set mode to

endcase

 

 

 

 

 

 

 

read. If it is not a

if fail

 

 

 

 

 

 

 

LIS cell, fail. Backtrack

then backtrack

 

 

 

 

on failure, otherwise con-

else P

 

P + instruction

 

size(P)

tinue execution with fol-

 

 

 

 

 

 

 

 

lowing instruction.

 

 

 

 

 

 

 

 

Copyright c Hassan A¨IT-KACI Reprinted from MIT Press

PAGE 101 OF 129

WARRENS ABSTRACT MACHINE

get constant c Ai

If the dereferenced value of register Ai is an unbound variable, bind that variable to constant c. Otherwise, fail if it is not the constant c. Backtrack on failure, otherwise continue execution with following instruction.

addr deref (Ai)

 

case STORE[addr ] of

 

h REF

 

i :

STORE[addr ] h CON c i

 

 

 

trail(addr)

h CON c0 i :

fail

(c =6 c0)

other

:

fail

true

endcase

 

 

 

 

if fail

then backtrack

else P P + instruction size(P)

Set instructions

set

 

variable Vn

 

 

 

 

 

 

 

 

 

 

 

 

 

Push a new unbound REF cell onto the

HEAP[H] h REF H i

heap and copy it into variable Vn. Con-

Vn

HEAP[H]

tinue execution with the following in-

H

H + 1

struction.

P

P + instruction

 

size(P)

set

 

value Vn

 

 

 

 

 

 

 

 

 

 

 

 

 

Push Vn’s value onto the heap. Continue

HEAP[H] Vn

execution with the following instruction.

H

H + 1

 

 

 

 

P

P + instruction

 

size(P)

PAGE 102 OF 129

Reprinted from MIT Press Copyright c Hassan A¨IT-KACI

A TUTORIAL RECONSTRUCTION

set local value Vn

If the dereferenced value of Vn is an unbound heap variable, push a copy of it onto the heap. If the dereferenced value is an unbound stack address, push a new unbound REF cell onto the heap and bind the stack variable to it. Continue execution with the following instruction.

set constant c

addr

deref (Vn)

 

if addr

< H

 

then HEAP[H]

HEAP[addr ]

else

 

 

begin

 

HEAP[H]

h REF H i

bind (addr H) end

H H + 1

P P + instruction size(P)

Push the constant c onto the heap. Con-

HEAP[H]

h CON c i

tinue execution with the following in-

H

H + 1

 

 

 

struction.

P

P + instruction

 

size(P)

 

 

 

 

 

 

 

 

 

set

 

void n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Push n new unbound REF cells onto the

for i H to H + n ; 1 do

heap. Continue execution with the fol-

 

HEAP[i]

h REF i i

lowing instruction.

H

H + n

 

 

 

 

 

 

 

P

P + instruction

 

size(P)

Unify instructions

unify

 

variable Vn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

In read mode, place the contents of

case mode of

 

 

 

heap address S into variable Vn; in

 

read :

Vn

HEAP[S]

write mode, push a new unbound

 

write :

HEAP[H] h REF H i

REF cell onto the heap and copy it

 

 

Vn

HEAP[H]

into Xi. In either mode, increment S

 

 

H

H + 1

by one. Continue execution with the

endcase

 

 

 

 

following instruction.

S

S + 1

 

 

 

 

 

 

 

 

P

P + instruction

 

size(P)

Copyright c Hassan A¨IT-KACI Reprinted from MIT Press

PAGE 103 OF 129

WARRENS ABSTRACT MACHINE

unify value Vn

In read mode, unify variable Vn and heap address S; in write mode, push the value of Vn onto the heap. In either mode, increment S by one. Backtrack on failure, otherwise continue execution with following instruction.

unify local value Vn

case mode of

read : unify(Vn S) write : HEAP[H] Vn

H H + 1

endcase

S S + 1 if fail

then backtrack

else P P + instruction size(P)

In read mode, unify

case mode of

 

 

 

 

variable Vn and heap

read

:

unify(Vn S)

 

address S. In write

write :

addr

deref (Vn)

 

mode, if the derefer-

 

 

if addr < H

 

enced value of Vn is an

 

 

then HEAP[H]

HEAP[addr ]

unbound heap variable,

 

 

else

 

push a copy of it onto

 

 

begin

 

the heap. If the deref-

 

 

 

HEAP[H]

h REF H i

erenced value is an un-

 

 

 

bind (addr H)

bound

stack

address,

 

 

end

 

push a

new

unbound

 

 

H

H + 1

 

REF cell onto the heap

endcase

 

 

 

 

 

 

and bind the stack vari-

S S + 1

 

 

 

 

 

able to

it.

In either

if fail

 

 

 

 

 

 

mode, increment S by

then backtrack

 

 

 

 

one. Backtrack on fail-

else P

P + instruction

 

size(P)

ure, otherwise continue

 

 

 

 

 

 

 

execution with follow-

 

 

 

 

 

 

 

ing instruction.

 

 

 

 

 

 

 

PAGE 104 OF 129

Reprinted from MIT Press Copyright c Hassan A¨IT-KACI

A TUTORIAL RECONSTRUCTION

unify constant c

In read mode, dereference the heap address S. If the result is an unbound variable, bind that variable to the constant c; otherwise, fail if the result is different than constant c. In write mode, push the constant c onto the heap. Backtrack on failure, otherwise continue execution with following instruction.

case mode of

read :

addr deref (S)

 

 

case STORE[addr ] of

 

 

h REF

 

i :

STORE[addr ] h CON c i

 

 

 

 

trail(addr)

 

h CON c0 i :

fail

(c =6 c0)

 

other

:

fail

true

 

endcase

 

 

 

 

write :

HEAP[H]

 

h CON c i

H H + 1

endcase if fail

then backtrack

else P P + instruction size(P)

unify void n

In write mode, push n new unbound REF cells onto the heap. In read mode, skip the next n heap cells starting at location S. Continue execution with the following instruction.

case mode of

 

read : S

S + n

write : for i

H to H + n ; 1 do

HEAP[i] h REF i i

H

H + n

endcase

P P + instruction size(P)

Copyright c Hassan A¨IT-KACI Reprinted from MIT Press

PAGE 105 OF 129

Соседние файлы в предмете Электротехника