简体   繁体   English

如何在尝试随机数时使用 cut 直到满足条件

[英]How to use cut while trying random numbers until a condition is met

I'm coding a board game similar to checkers using prolog and I have this function that tests random generated numbers.我正在使用 prolog 编写类似于跳棋的棋盘游戏,我有这个 function 来测试随机生成的数字。 I want it to return the first instance that works but, for some reason, it fails after finding it because it tries to redo in what I can only guess is an attempt to find other suitable solutions.我希望它返回第一个有效的实例,但由于某种原因,它在找到它后失败了,因为它试图重做,我只能猜测是试图找到其他合适的解决方案。

%cell_status(+Board, +pos(X,Y), -Status)
cell_status([cell(X,Y,S)|_], pos(X,Y), Status) :-
    Status = S, !.                                           
cell_status([_|T], pos(X,Y), Status) :-
    cell_status(T, pos(X,Y), Status).

%select_random_piece(+Board, +Player, -X, -Y)
select_random_piece(Board, Player, X, Y) :- 
    random(0, 6, X_tmp),
    random(0, 5, Y_tmp),
    write('testing X: '), write(X_tmp), nl,
    write('testing Y: '), write(Y_tmp), nl,
    cell_status(Board, pos(X_tmp,Y_tmp), Status),
    (%if
        Status == Player ->
     %then
        X is X_tmp,
        Y is Y_tmp;
     %else
         select_random_piece(Board, Player, X_tmp, Y_tmp),
         X is X_tmp, Y is Y_tmp
    ).

I tried debugging using trace and verified that after cell_status exits with a correct Status value it tries to redo cell_status again and fails.我尝试使用跟踪进行调试,并验证了在 cell_status 以正确的 Status 值退出后,它再次尝试重做 cell_status 但失败了。 I also checked that cell_status works fine by itself.我还检查了 cell_status 本身是否正常工作。

How can I use cut in order to stop it from finding other solutions?我如何使用 cut 来阻止它寻找其他解决方案? Or am I missinterpreting the problem?还是我误解了问题?

Looks like this is all you need, for select_random_piece :对于select_random_piece ,看起来这就是您所需要的:

select_random_piece(Board, Player, X, Y) :- 
    between(0, 6, X),
    between(0, 5, Y),
    cell_status(Board, pos(X,Y), Player).

between creates choicepoints, for Prolog's inference engine to backtrack to, in search of a solution. between创建选择点,供 Prolog 的推理引擎回溯,以寻找解决方案。

Let's avoid the complication of random , until fundamentals such as backtracking are understood.让我们避免random的复杂化,直到理解回溯等基本原理。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM