Пролог итерации от 1 - PullRequest
       5

Пролог итерации от 1

0 голосов
/ 09 марта 2012

У меня есть итератор с именем myfor, такой, что когда я вызываю myfor(3,7,X)., я хочу, чтобы он возвратил X = [3, 4, 5, 6, 7].Однако этот код возвращает только X = [4, 5, 6, 7].Он пропускает первый.Может кто-нибудь сказать мне, что не так?

myfor(A, A, []) :- !.

myfor(Start,End, Z) :-

    End > Start,
    NewValue is Start+1,
    myfor(NewValue,End, L),
    append([NewValue], L, Z).

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Кстати, если вы используете swi-пролог и, конечно, некоторые другие прологи, between/3 близок к тому, что вы называете myfor/3, и с одним или двумя listing/1 вызовами вы можете получить хорошее представление о том, как он реализован.поиск между ними должен делать то, что делает ваш предикат.

1 голос
/ 09 марта 2012

Не удалось проверить это в Прологе (так как у меня его нет на моей рабочей машине).Вот мои 2 бита

myfor(A, A, [A]) :- !.

myfor(Start,End, Z) :-
End > Start,
NewValue is Start+1,
myfor(NewValue,End, L),
append([Start], L, Z).
0 голосов
/ 09 марта 2012

Попытка реализовать цикл for / next в прологе является ярким свидетельством того, что вы думаете с точки зрения императивного программирования, где вы говорите компьютеру, что делать, а не с точки зрения декларативное программирование, где вы описываете решение и позволяете механизму вывода Prolog выяснить это.

Если, однако, вы хотите создать список, содержащий упорядоченный диапазон чисел, что-то вроде следующего будет "git""сделано" с помощью магии списка различий:

range( X , X , [X] )
  .
range( X , Y , [X|Z] ) :-
  X < Y ,
  X1 is X + 1 ,
  range( X1 , Y , Z )
  .
range( X , Y , [X|Z] ) :-
  X > Y ,
  X1 is X - 1 ,
  range( X1 , Y , Z )
  .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...