Определить самодвойственность функции - 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
.
every
- это функция, которая принимает два аргумента: список элементов и предикат. Она возвращаетnil
, если предикат не выполняется ни для одного элемента списка, иt
, если предикат выполняется для каждого элемента списка.lambda
- это функция, которая создает анонимную функцию. В данном случае создается анонимная функция, которая принимает два аргументаx
иy
и возвращаетnil
, еслиx
не равноy
, иt
, еслиx
равноy
. Внутри функцииf
происходит следующее:- Создается анонимная функция с помощью
lambda
, которая принимает два аргументаx
иy
и возвращаетnil
, еслиx
не равноy
, иt
, еслиx
равноy
. - Эта анонимная функция передается в
every
вместе с аргументомw
. every
проверяет, выполняется ли предикат для каждого элементаw
. Если предикат выполняется, тоevery
возвращаетnil
. Если предикат не выполняется, тоevery
возвращаетt
.- Результат работы
every
передается вreverse
, который возвращает списокw
в обратном порядке. Таким образом, функцияf
возвращает списокw
в обратном порядке, если все элементыw
различны. Если есть хотя бы два одинаковых элемента, то функцияf
возвращаетnil
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д