将方案函数转换为Prolog

时间:2019-05-07 19:48:53

标签: prolog scheme code-translation

我有两个功能需要从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).

0 个答案:

没有答案