Преобразование функций схемы в пролог - PullRequest
1 голос
/ 07 мая 2019

У меня есть две функции, которые мне нужно преобразовать из схемы в пролог для выполнения задания.

Один называется 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).
...