Обновить
10

Пользователь

6
Подписчики
Отправить сообщение
#ТЕОРИЯ
#ПРЕДИКАТ И КВАНТОР СУЩЕСТВОВАНИЯ
#РАВНОЧИСЛЕННОСТЬ
#РЕАЛИЗАЦИЯ СЧЕТА


########################################################################
print("\n________________________ТЕОРИЯ_______________________________")

print(""" 
Законы логики используют True, False.

False == (not True) and True

т.е. само False выразимо так и никак иначе (если соблюдать требование, 
чтобы в определяющей части не было терминов определяемого)
 
Можно переписать и так: False == (A != A) and (A == A)
т.е. (дословно) "Ложь равна тому, что не равно и равно себе"

=> без False мир невыразим полно.
=> само False выразимо через самоотрицание (всегда ложную формулу)

Без False не выразить НОЛЬ элемента в множестве. Пусть имеем множество 
и требуется определить есть ли элемент b в таком множестве. Тогда для 
каждого элемента множества проверяем (Xi == b). Если каждое сравнение 
False - элемента b нет в множестве.

 ##################################################################
 # Пусть имеем множество {a, b}. О каждом элементе можно сказать, # 
 # что он один. На основании чего? На основании того, что у них   # 
 # есть общее. И оно единственно: каждый элемент равен себе.      #
 ##################################################################
 
Имеем: a - одно, b - одно (единица - свойство чего-либо равняться себе)

Между понятиями один и первый нет разницы. 
Но оно есть между понятиями один и второй.

Второй - то, что равно себе && не равно (как элемент) первому (элементу)
т.е предыдущему. Объединение первого и второго даст понятие два.

=> Чтобы выразить натуральные числа, достаточно оперировать понятиями 
(равно, не). Число ноль необходимым образом определяется через всегда 
ложную формулу.

В школах учат с понимания числа один: яблоко - одно, карандаш - один, 
и т.д. На множестве примеров у детей формируется правило выделения 
ОБЩЕГО в РАЗНОМ.

Немыслимо, чтобы в школах учили с понимания нуля.
Когда в трактовках математики ноль определяется через пустое множество, 
а затем единица определяется через ноль, то математика попросту 
игнорирует тот факт, что само пустое множество определяется как 
(нет ни ОДНОГО элемента), содержащим уже понятие единицы 
(пусть и с отрицанием)
""")


########################################################################
print("\n____________ПРЕДИКАТ И КВАНТОР СУЩЕСТВОВАНИЯ_________________")

print(
""""
(один или более одного) заменяется на (существует или существуют)
как пример, в множестве {2, 3, 4}
    существует четное число или существуют четные числа
 => Тогда это и логично, и с точки зрения языка правильно
""")

def exists(M):
    for num in M:
        if num % 2 == 0: 
            return True
    return False

M = {2, 3, 4}
print("\n M =", M, "\n")

print(" квантор существования (один или более одного)", exists(M))
print(" существует или существуют четные числа в М", exists(M), "\n")

for x in M:
    if x % 2 == 0:
        print(" предикат .. здесь", x, "- четно")
    else: 
        print(" предикат .. здесь", x, "- не четно")


########################################################################
print("\n______________________РАВНОЧИСЛЕННОСТЬ_______________________")

print("""\nКак сказать для множеств, что они равномощны,
не употребляя слова c "один", включая взаимно-ОДНОзначно?
Выделяем в каждом элементе свойство (равняться себе)
Тогда равночисленно: (a==a) == (e==e)
              (равное_себе) == (равное_себе)""")

print("""\n    На этом основании:""")
def iseq(m1, m2):
    s1=[]; s2=[]
    for x in m1:
        s1.append(x==x)
    for x in m2:
        s2.append(x==x)

    if s1 == s2:
        return "равномощны"
    else:
        return "не равномощны"


a="a"; b="b"; c="c"; m1 = {a,b,c}
e="e"; r="r"; p="p"; m2 = {e,r,p}; m3 = {e,r}

print("Множества", iseq(m1, m2), ":", m1, m2) # равномощны
print("Множества", iseq(m1, m3), ":", m1, m3) # не равномощны
print("Множества", iseq({a,(b,c)}, {e,r}), ":", {a,(b,c)}, {e,r})# ==

print("""
Часто приходится читать: множества равномощны, когда состоят из одного 
и того же числа элементов (пример Фреге: каждой тарелке однозначно 
отнесен нож .. и каждому ножу однозначно отнесена тарелка )

Критика: но само употребление (из одного и того же числа элементов) уже 
использует понятие единицы. Иногда прячут ВЗАИМНО-однозначно под 
словом биекция.

Общая ПРОБЛЕМА таких определений в невозможности выразить количественные
отношения (хоть и неявного) без использования единицы.
т.е. они определяют числа через их же (уже используя единицу)
""")

########################################################################
print("\n_____________________РЕАЛИЗАЦИЯ СЧЕТА________________________")

#код взят из @XAITALKS #выложил Alex Bur
add = lambda a, b: (lambda f: f(f, a, b))(lambda self, a, b: a \
      if b == False else self(self, a ^ b, (a & b) << True))
print("7 + 1 =", add(7, 1)) # выведет 8
print("""
Работает с 0 (False) и 1 (True) в битовом представлении, полностью 
имитируя сложение столбиком. Числа ноль и один выражены как 
"неравное себе" и "равное себе"

Формировать ряд чисел 0->1->10->11->100 значит использовать СЛЕДОВАНИЕ 
(различаться с каждым предыдущим), что здесь и реализовано.
""")

Если цитировать учебник по логике Колмогорова (скрин), то использование эквивалентности суть использование отношения (один к одному), т.е использование (неявное) единицы, которую только собираемся определить

==три палочки ~ три камня== “Кучка каких-то объектов эквивалентна кучке других объектов, если каждому объекту из первой кучки можно поставить в пару единственный объект из второй кучки”

Суть в том, что пытаемся определить числа, неявно их же используем. В частности, “единственный” уже предполагает знание единицы.

Что по ссылке? Упрощённая версия от Андрея Карпаты

Кстати, здесь тоже 2 переменные

А что происходит, если ранее обученная машина (на множестве таких вот выученных закономерностей), начинает пытаться понять нечто-новое? Происходит то, что она уже выученными пытается интерпретировать новые данные. .. Это называется "глаза зашорены". Поэтому иногда маленькая LLМ лучше большой обученной

Что человек, что машина ищут так же.

Разница между LLM-многомиллионной и LLM-копеечной в том, что последняя не отягощена "как надо правильно думать". И поэтому она закономерность находит.

Дословно: верно, что
ложь равна тому, что ложь равна и не равна лжи.
(Уберите ложное (ложь не равна лжи) и вся конструкция перестанет быть верной.

На python

print(False == ((False == False) and (False != False)))

И на С++

#include
int main() {
  std::cout << (false == ((false == false) && (false != false)));
}

И даже на rust

fn main() {
    println!("{}", (false == ((false == false) && (false != false))));
}

1) выражения языка (такие, как 2 + 3, х + 3, х = у, х = 3, 2 = 3, 2 = 2  — в отличие от таких как + = х)
2) среди выражений выделяются так называемые формулы, означающие при интерпретации «утверждения, зависящие, быть может, от параметра» (такие, как х = 3, х = у, 2 = 3, 2 = 2)
3) среди формул выделяются так называемые замкнутые формулы, или утверждения, не зависящие от параметра, (такие, как 2 = 3,2 = 2)
4) среди утверждений выделяются истинные утверждения (такие, как 2 = 2)

Когда пишу проекты, использую не только формулы, о которых можно сказать, что они иногда истинны. Но и формулы, которые всегда истинным. И формулы, которые всегда ложны. Без последних не все можно выразить.

Формулы применимы. И это главное. Касается как части f:x->y, так и части с ложными формулами.

В пользу такой теории говорит то, что трансформер, например, такие зависимости тоже видит

GPT:
,14,32), (54,45,36,15,32), (54,44,36,14,31), (53,41,34,15,31), (52,45,36,52,32), (52,44,34,44,32), (53,44,36,14,31), (54,41,35,,), (52,41,34,52,32), (52,45,34,45,32), (52,45,35,14,32), (52,45,36,15,31), (52,44,34,52,32), (,44,36,44,31), (54,41,34,54,32), (,,,,), (52,44,34,52,31), (53,44,35,14,32), (54,45,36,15,32), (,,,,), (52,41,36,41,31), (52,44,34,52,31), (53,,35,14,32), (54,45,36,15,32), (54,44,36,14,31), (53,41,34,15,31), (52,45,36,52,32), (52,44,34,44,32), (53,44,36,14,31)

(54,45,36,15,32), (54,44,36,14,31), (53,41,34,15,31), (52,45,36,52,32), ... (очень неплохо!)

Backtrack(x) if x is not a solution return false if x is a new solution add to list of solutions backtrack(expand x)

Почему так странно использую? Есть варианты с разными выборками (и с решением других задач) из setEdge (без обсчёта ({v, w[0]}, w[1]). Но суть, применительно к статье, все равно одна.

ваш dfs работает за O(E^3)

Разве была претензия на более низкую алгоритмическую сложность по сравнению с существующими алгоритмами? Справочнику - привет.

где у вас тут "ребра вместо вершин"

Именно "ребра вместо вершин". Возьмите обычный поиск с возвратом, который работает именно с вершинами.


graph = {'A': ['B', 'C'],
             'B': ['C', 'D'],
             'C': ['D'],
             'D': ['C'],
             'E': ['F'],
             'F': ['C']}

#
print('\n  __find_path')             
def find_path(graph, start, end, path=[]):
        path = path + [start]
        if start == end:
            return path
        if not start in graph:
            return None
        for node in graph[start]:
            if node not in path:
                newpath = find_path(graph, node, end, path)
                if newpath: return newpath
        return None
        
print(find_path(graph, 'A', 'D')) # ['A', 'B', 'C', 'D']

Ну, и не надо пытаться запускать dfs от каждой вершины

Задача ведь не только в том, чтобы определить является граф Эйлеровым или полу-Эйлеровым. Задача показать из каких стартовых вершин Эйлеровый путь находится, а из каких нет. Не заметили?

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность