如果语句失败,再次调用谓词

Call predicate again if a statement fails

我是 Prolog 的新手。如果语句在内部计算为真,我是否可以继续执行谓词?这是我的代码片段:

%Ylist contains: [1,2,3]
validatemove(_,[],_). % goal if Ylist is empty

validatemove(X, [Y1|Ylist], Node) :-
    X \= 0,     % if X is 0, return false
    Y1 \= 0,    % if Y1 is 0, do not execute rest of code,
                % call validatemove(X, Ylist, Node) again
    Some predicates here,
    ....,
    validatemove(X, Ylist, Newnode).

我正在努力想出这样的东西。无论哪种方式,我都想遍历 Ylist 中给出的所有值。我应该在这里做什么?

您似乎在寻找 if-then-else 控制结构。可能是这样的:

%Ylist contains: [1,2,3]

validate_move([], _, _). % goal if Ylist is empty

validate_move([Y| Ys], X, Node) :-
    X =\= 0,
    % if X is 0, return false
    (  Y =:= 0 ->
       validate_move(Ys, X, Node)
    ;  % Some predicates here,
       validate_move(Ys, X, NewNode)
    ).

请注意,假设您的列表在调用谓词时已知,最好将其移动到第一个参数以利用 Prolog 第一个参数索引(大多数系统都实现了)。您似乎在比较整数,因此请使用算术比较谓词而不是统一谓词。此外,使用下划线分隔原子中的单词以及仅对变量使用 CamelCase 也是一种很好的 Prolog 编程风格。