int main() { put_structure("h", 2, 3); /* ?- X3 = h */ set_variable(2); /* (Z, */ set_variable(5); /* W), */ put_structure("f", 1, 4); /* X4 = f */ set_value(5); /* (W), */ put_structure("p", 3, 1); /* X1 = p */ set_value(2); /* (Z, */ set_value(3); /* X3, */ set_value(4); /* X4). */ print_register(1); /* drukowanie X1 */ dump_heap(); fail = false; get_structure("p", 3, 1); /* X1 = p */ unify_variable(2); /* (X2, */ unify_variable(3); /* X3, */ unify_variable(4); /* Y), */ get_structure("f", 1, 2); /* X2 = f */ unify_variable(5); /* (X), */ get_structure("h", 2, 3); /* X3 = h */ unify_value(4); /* (Y, */ unify_variable(6); /* X6), */ get_structure("f", 1, 6); /* X6 = f */ unify_variable(7); /* (X7), */ get_structure("a", 0, 7); /* X7 = a */ printf("fail = %d\n", (int)fail); print_register(1); /* drukowanie X1 */ dump_heap(); return 0; }
int get_value(wam_t *wam, char *regname, char* valname) { unify_variable(wam, valname, regname); return 0; }
int wam_run(wam_t *wam) { wam->failed = 1; wam->opcnt = 0; wam->bpcnt = 0; int time = 0; int halted; while (wam->pc >= 0) { halted = 0; time += 1; wam->failed = 0; stmt_t *stmt = wam->prog->stmts[wam->pc]; if (wam->opcnt > wam->maxopcnt) { printf("panic: maximum opcnt reached\n"); wam->failed = 1; break; } if (time > 10000) { printf("> 10000\n"); stmt->op = OP_HALT; wam->failed = 1; break; } switch (stmt->op) { case OP_ALLOC: allocate(wam); break; case OP_DEALLOC: deallocate(wam); break; case OP_CALL: wam_call(wam, stmt->jump); break; case OP_CREATE_VAR: create_variable(wam, stmt->args[0], stmt->args[1]); break; case OP_GET_CONST: get_constant(wam, stmt->args[0], stmt->args[1]); break; case OP_GET_VAL: get_value(wam, stmt->args[0], stmt->args[1]); break; case OP_GET_VAR: get_variable(wam, stmt->args[0], stmt->args[1]); break; case OP_PUT_VAL: put_value(wam, stmt->args[0], stmt->args[1]); break; case OP_PUT_VAR: put_variable(wam, stmt->args[0], stmt->args[1]); break; case OP_PUT_CONST: put_constant(wam, stmt->args[0], stmt->args[1]); break; case OP_HALT: halted = 1; case OP_NOOP: wam->pc += 1; break; case OP_PROCEED: proceed(wam); break; case OP_RTRY_ME_ELSE: case OP_TRY_ME_ELSE: try_me_else(wam, stmt->jump); break; case OP_TRUST_ME: wam->pc++; break; case OP_UNI_STRUC: unify_struc(wam, stmt->args[0], stmt->args[1], stmt->args[2]); break; case OP_UNI_VAR: unify_variable(wam, stmt->args[0], stmt->args[1]); break; case OP_UNI_LIST: unify_list(wam, stmt->args[0], stmt->args[1], stmt->args[2]); break; default: printf("unknown wam op in line %d!\n", wam->pc); wam_backtrack(wam); break; } if (halted) break; } if (halted) return 0; if (wam->failed) { while (wam->cp != NULL) wam_backtrack(wam); wam_backtrack(wam); } return 0; }