Определить самодвойственность функции - 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.