Определить самодвойственность функции - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д