Умножить в схеме для списков минусов

Мне удалось сделать код схемы, чтобы добавить в схему два списка минусов. скажем, list1 - '( p. d) list 2 ' ( p p p. d) моя пользовательская функция добавления, использующая концепции cdr и car, может делать ( p p p p. d), как и ожидалось.

Однако теперь я хочу умножить оба и на основе количества p, у меня есть пользовательская функция, которая дает мне количество списков. скажем, для списка1 -> 1 списка2-> 3

Я также могу определить, пуст ли какой-либо из двух списков, поэтому я вывожу 'd.

Но настоящая проблема заключается в том, когда дело доходит до умножения. list1 - '(pp .d) list2 - '(pp p p p p .q) ожидаемый результат - (2 * 5 = 10 p's) so '(pp p p p p p p p p p .z)

Я пытался использовать цикл while, do while, добавить пользовательскую функцию, но не могу понять, как это сделать. Может быть, какие-то рекомендации помогут мне :)

Я хочу создать пользовательскую функцию, так как не хочу использовать набор! или что-нибудь, что упрощает процесс, но вы хотите понять, как рекурсия может работать в этом случае :).


person user222040    schedule 04.10.2015    source источник
comment
Что такое d и z? Обычно сумма двух списков является стандартной процедурой append, но она не может делать точечные списки, поскольку (a . b), добавленное к (a . b), по вашему мнению, равно (a a . b), но как насчет первых списков b?? Вы говорите, что написали код, но где он? Если вам нужна помощь, вам нужно приложить некоторые усилия.   -  person Sylwester    schedule 05.10.2015
comment
Вы хотите реализовать числа Пеано... верно?   -  person Daniel Jour    schedule 05.10.2015
comment
Ваша логика хороша, но проблема заключается в деталях вашего кода, поэтому, имея только логику и отсутствие кода, нам трудно догадаться, что вы делаете неправильно... Почему бы вам не переписать его (это не займет много времени). более 2 минут, если вы знаете логику, которой следуете), чтобы мы могли ее проверить?   -  person Kevin    schedule 05.10.2015


Ответы (1)


Я добавляю это как ответ, поскольку он, кажется, решает вашу первоначальную проблему, пытаясь реализовать числа Пеано, используя списки минусов в схеме.

Для этого он начинает с нулевого значения и выполняет функции увеличения и уменьшения чисел.

;; We define our abstraction for zero
(define zero 'D)

;; Increment a number, i.e. get its successor
(define (inc number)
    (cons 'P number))

;; Decrement a number, i.e. get its predecessor
(define (dec number)
    (cdr number))

Это позволяет проходить все (положительные) целые числа. На основе этих функций мы можем построить функцию добавления рекурсивного характера, используя:

a + 0 = a
a + b = (a + 1) + (b - 1)

Точно так же функция умножения может быть построена на функции сложения, используя:

a * 0 = 0
0 * b = 0
a * 1 = a
a * b = a + (a * (b - 1))

Это приводит к следующему, хотя и крайне неэффективному коду:

;; Adding two numbers is done by "shifting" from one to the other, one by one.
;; a + b = (a + 1) + (b - 1)
(define (add lhs rhs)
    (if (eq? rhs zero)
        lhs
        (add (inc lhs) (dec rhs))))

;; Multiplying the dumb way:
;; a * b = a + (a * (b - 1))
(define (mul lhs rhs)
    (if (or (eq? rhs zero) (eq? lhs zero))
        zero
        (if (eq? rhs (inc zero))
            lhs
            (add lhs (mul lhs (dec rhs))))))

(живой пример)

person Daniel Jour    schedule 05.10.2015
comment
Большое спасибо ... Я тоже скоро опубликую решение ... Однако вопрос, который я разместил в своем предыдущем комментарии, кажется очень сложным по сравнению с числами пеано, которые, как мне кажется, относительно намного проще ... - person user222040; 05.10.2015
comment
Этот вопрос связан с исходным вопросом? Что вы подразумеваете под кортежами? - person Daniel Jour; 05.10.2015
comment
Да, это работает, но может ли кто-нибудь помочь, как я могу это понять? Так как я относительно новичок в схемах. Может быть, можно построить ту же логику, но используя базовые вещи... любопытно :) - person user222040; 06.10.2015
comment
Смысл абстракций в том, чтобы скрывать вещи. Поэтому, если вы не понимаете решения, просто попробуйте реализовать используемые абстракции (map и друзья) самостоятельно, поработайте с ними над некоторыми наборами данных и т. д. Это даст вам представление о том, что они делают, так что вы можете использовать это, чтобы понять сложную функцию в связанном ответе. Написание этой функции без использования этих абстракций привело бы к огромному количеству текста, который невозможно поддерживать и понять. - person Daniel Jour; 06.10.2015
comment
Согласен ... Но да, как я уже сказал, мне было просто любопытно :) - person user222040; 06.10.2015
comment
Может быть, если бы я мог руководствоваться тем, как его отлаживать и видеть значения по мере их изменения... Я использовал netbeans в java с часами, и это был такой потрясающий опыт отладки :) - person user222040; 06.10.2015