基本上我有一个谓词对(Z,X,Y)
我想输出从0到Z的所有X和Y对
例如,我想要一个看起来像
的电话pair(3,X,Y).
X=0
Y=0;
X=0
Y=1;
X=0
Y=2;
X=0
Y=3;
X=1
Y=0;
X=1
Y=1;
...
X=3
Y=3;
到目前为止我已经
了pair(_,0,0).
pair(Z,X,Y) :-
...
pair(S,X2,Y2)
...
我是Prolog的新手所以我不确定如何填写由...分隔的区域 我认为我应该做的是说些什么 (在伪代码中) "如果Y2 = S则说X是X1 + 1而Y是0"
或者那些喜欢的东西。 但这似乎是一种非常迂回的做事方式。所以我想知道是否有更优雅的方式。
答案 0 :(得分:0)
更简单的方法是使用内置谓词between/3
:
pair(S, X, Y):-between(0, S, X), between(0, S, Y).
修改强>
如果你想按照你所说的顺序构建对,你可以尝试沿着这条线:
pair(_, 0, 0).
pair(S, X, Y):- pair(S, X1, Y1),
(
S =:= Y1, (S =:= X1, !, false ; X is X1 + 1, Y is 0)
;
S =\= Y1, X is X1, Y is Y1 + 1
).
因此,给定一对(X1, Y1)
,您可以使用您描述的规则推断下一个(X, Y)
。如果Y1
等于S
,那么如果X1
等于S
,您就会终止执行,或者您生成(X1+1, 0)
对。如果Y1
不等于S
,则推断(X1, Y1+1)
。