2014-12-07 3 views
0

В основном у меня есть пара предикат (Z, X, Y)Генерация перестановок X и Y в Прологе

Вы хотите вывести все пары X и Y от 0 до Z

Например, я хочу вызов выглядеть

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) 
    ... 

Я новичок в Прологе, так что я не уверен, как заполнить в районах с eparated по ... То, что я думаю, что я должен сделать, это сказать что-то вдоль линий (В psuedocode) «Если Y2 = S, то говорят Х X1 + 1 и Y = 0»

Или что-то вдоль тех, нравится. Но это похоже на очень окольный способ делать что-то. Поэтому мне было интересно, есть ли более элегантный способ.

ответ

0

Более простой способ заключается в использовании встроенный предикат between/3:

pair(S, X, Y):-between(0, S, X), between(0, S, Y). 

Edit:

Если вы хотите строить пары в последовательности, как вы сказали, вы можете попробовать что-то по этой линии:

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).

Смежные вопросы