如果语句失败,再次调用谓词
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 编程风格。
我是 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 编程风格。