По сути, вы забыли одну вещь: вычислить разницу в рекурсивном случае:
sameSeqDiffs([X,Y], Result):-
A is Y - X,
A = Result.
sameSeqDiffs([X,Y,Z|T], Result):-
<b>Result is Y - X,</b>
sameSeqDiffs([Y,Z|T], Result).
Так что здесь мы объединяем Result
с разницей между Y
и X
.Мы делаем повторный вызов с этим различием, так что «более глубокий» рекурсивный вызов объединится с уже обоснованным различием.Если различия не совпадают, то предикат потерпит неудачу.
Вы также можете сделать первое предложение более элегантным, немедленно используя Result
в вызове предиката is/2
вместо первого использованияпеременная (A
), а затем объединяя ее, так:
sameSeqDiffs([X,Y], Result):-
<b>Result</b> is Y - X.
sameSeqDiffs([X,Y,Z|T], Result):-
Result is Y - X,
sameSeqDiffs([Y,Z|T], Result).
Затем мы получаем следующие результаты:
?- sameSeqDiffs([3, 5, 7], D).
D = 2 ;
false.
?- sameSeqDiffs([3, 5, 7], 2).
true ;
false.
?- sameSeqDiffs([3, 5, 7], 4).
false.
?- sameSeqDiffs([2, 3, 4], 1).
true ;
false.
?- sameSeqDiffs([2, 3, 4, 6], 2).
false.
?- sameSeqDiffs([2, 3, 4, 6], 1).
false.
Тот факт, что он возвращает false
после true
связано с прослеживанием Пролога и стремлением найти другое решение.Поэтому, если он печатает true; false.
, мы знаем, что попытка была успешной, и, следовательно, предикат успешно.