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

时间:2015-02-14 22:24:24

标签: prolog predicate

我是Prolog的初学者。如果语句内部的值为true,我是否可以继续执行谓词?这是我的代码片段:

%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中给出的所有值。我该怎么办?

1 个答案:

答案 0 :(得分:1)

您似乎正在寻找 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编程风格。