我有两个功能需要从Scheme转换为Prolog进行分配。
一个被称为cycler
,并通过数字+,-,*的顺序运行给定的数字,直到其用尽。
第二个listsMax
被赋予两个列表,并返回两个列表之间的最大值列表,并在每个索引处比较该索引的最大值。
下面是我分配方案和尝试Prolog版本的原始解决方案。请特别验证我的Prolog逻辑是否有缺陷,尽管我猜测我在语法上是错误的。
(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).