Определить самодвойственность функции - Lisp

Узнай цену своей работы

Формулировка задачи:

Добрый вечер, напишите пожалуйста программу определения (не)самодвойственности булевой функции, заданной вектором ее значений. Написал программу на C++, можете ее оттранслировать на lisp?
#include <iostream>
using std::cout;
using std::cin;
 
#include <string>
using std::string;
using std::getline;
 
#include <iomanip>
using std::endl;
using std::boolalpha;
 
#include <algorithm>
using std::remove;
 
#include <windows.h>
 
bool isSelfDualFunc(string vector)
{
    vector.erase(remove(vector.begin(), vector.end(), ' '),
        vector.end());
    for (size_t size(vector.length() - 1), i(size >> 1); i + 1; i--)
        if (vector[i] == vector[size - i])
            return false;
    return true;
}
 
int main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Введите вектор значений функции:" << endl;
    string vector; getline(cin, vector);
    cout << "\nБулева функция самодвойственна: "
        << boolalpha << isSelfDualFunc(vector) << '\n' << endl;
    system("pause");
    return 0;
}
можете ее оттранслировать на lisp?
Или написать свою реализацию...

Решение задачи: «Определить самодвойственность функции»

textual
Листинг программы
(defun f (w)
  (every '(lambda (x y) (not (equal x y)))
          w
          (reverse w)))

Объяснение кода листинга программы

В данном коде определена функция f, которая принимает один аргумент w. Внутри функции происходит использование комбинации функций every и lambda.

  1. every - это функция, которая принимает два аргумента: список элементов и предикат. Она возвращает nil, если предикат не выполняется ни для одного элемента списка, и t, если предикат выполняется для каждого элемента списка.
  2. lambda - это функция, которая создает анонимную функцию. В данном случае создается анонимная функция, которая принимает два аргумента x и y и возвращает nil, если x не равно y, и t, если x равно y. Внутри функции f происходит следующее:
  3. Создается анонимная функция с помощью lambda, которая принимает два аргумента x и y и возвращает nil, если x не равно y, и t, если x равно y.
  4. Эта анонимная функция передается в every вместе с аргументом w.
  5. every проверяет, выполняется ли предикат для каждого элемента w. Если предикат выполняется, то every возвращает nil. Если предикат не выполняется, то every возвращает t.
  6. Результат работы every передается в reverse, который возвращает список w в обратном порядке. Таким образом, функция f возвращает список w в обратном порядке, если все элементы w различны. Если есть хотя бы два одинаковых элемента, то функция f возвращает nil.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы