Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
int get_value(wam_t *wam, char *regname, char* valname)
{
	unify_variable(wam, valname, regname);
	return 0;
}
Ejemplo n.º 3
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;
}