У меня есть две функции, которые мне нужно преобразовать из схемы в пролог для выполнения задания.
Один называется cycler
и пропускает заданное число через список чисел +, -, * в том порядке, пока не исчерпает список.
Второй, listsMax
, получает два списка и возвращает список максимумов между двумя, сравнивая в каждом индексе для максимума индекса.
Ниже приведены оригинальные решения для моего назначения в Схеме и мои попытки выпустить версии Пролога. Пожалуйста, уточните, особенно ли ошибочна моя логика Пролога, хотя я предполагаю, что я синтаксически ошибочен.
(define (cycler L N)
(countCycle L N 0)
)
(define (countCycle L N i)
(cond ((null? L) N)
((= (modulo i 3) 0)
(countCycle (cdr L) (+ N (car L)) (+ i 1)))
((= (modulo i 3) 1)
(countCycle (cdr L) (- N (car L)) (+ i 1)))
((= (modulo i 3) 2)
(countCycle (cdr L) (* N (car L)) (+ i 1)))
)
)
cycler([], N, 0).
cycler([X|Y], N, I) :- 0 is mod(I, 3), N is N + X, I is I + 1, cycler([L], N, I).
cycler([X|Y], N, I) :- 1 is mod(I, 3), N is N - X, I is I + 1, cycler([L], N, I).
cycler([X|Y], N, I) :- 2 is mod(I, 3), N is N * X, I is I + 1, cycler([L], N, I).
И
(define (listsMax L M)
(consMax L M '())
)
(define (consMax L M N)
(cond ((null? L) N)
(> (car L) (car M)
((consMax (cdr L) (cdr M) (cons (car L) N))))
(else
((consMax (cdr L) (cdr M) (cons (car M) N))))
)
N
)
listsMax([], [], []).
listsMax([X|W], [Y|Z], [M]) :- X >= Y, listsMax([W], [Z], append([M], X, A)).
listsMax([X|W], [Y|Z], [M]) :- X < Y, listsMax([W], [Z], append([M], Y, A)).
append( [], X, X).
append( [X|Y], Z, [X|W]) :- append( Y, Z, W).