중복 값이없는 1000 개 이상의 변수를 확인하는 방법은 무엇입니까?

vhthc

저는 Z3를 처음 접했고 오픈 소스 프로그램의 경우 z3 솔버를 사용하여 효율성을 높이고 싶습니다.

약 1000 개 이상의 값이 있습니다.

(declare-const a1 Int)
(declare-const a2 Int)
(declare-const a3 Int)
(declare-const a4 Int)
...

그 결과

(declare-const x1 Int)
(declare-const x2 Int)
...
(assert (=  (+ a1 a2) x1) // in reality its not "plus" but more sophisticated
(assert (=  (+ a3 a4) x2) // however for simplicity lets keep it at that here.
...

이제 모든 x1 ~ x500 + 변수의 값이 서로 다르고 중복이 없는지 확인하고 싶습니다.

물론 할 수 있습니다

(assert (not (= x1 x2)))
(assert (not (= x1 x3)))
(assert (not (= x1 x4)))
...
(assert (not (= x2 x3)))
(assert (not (= x2 x4)))
...
(assert (not (= x718 719)))

그리고 그것은 작동 할 것입니다. 그러나 더 나은 해결책이 있습니까?

감사합니다!

패트릭 트 렌틴

다음을 사용할 수 있습니다 distinct(이 참조 ).

(assert (distinct x1 ... x500))

AFAIK, 이것은 일반적으로 예제에서 제시 한 것과 마찬가지로 일련의 부등식으로 내부적으로 확장됩니다.


토론 : 다음은이 인코딩의 효율성에 대한 순전히 이론적 인 토론입니다. z3매우 효율적인 SMT 솔버이므로 단순히 도구를 실행하는 것보다 더 복잡한 것을 시도 할 필요가 없습니다.

평등의 부정 (예 :) (not (= x y))은 일반적으로 한 쌍의 부등식으로 나뉩니다.

x < y \/ x > y

의 말을하자 x < yx > y이름이 변경 B1B2다음 절을 SAT 엔진에 공급되는 각각 :

B1 \/ B2

이제 문제가 주어지면 수백 개의 절이 있습니다. 이들은 모두 선형 산술 수준에서 서로 관련되지만 SAT 엔진이 작동하는 부울 수준에서는 관련이 없습니다. 따라서 SAT 엔진은 일반적으로 <연산자 의 전이 속성을 위반하는 (상당한) 수의 불일치 부분 진실 할당을 생성 할 가능성이 있습니다.

 x < y /\ y < z /\ z < x

이러한 충돌은 LRA에 대한 이론 솔버가 조기 정리 호출 중에 드러내고 잘못된 할당을 차단하는 충돌 절을 학습하여 부울 수준에서 해결됩니다.

시도 할 수있는 작업 :

  • 문제가 그러한 단순화를 인정 한다면 (이름 x1 ... x500이 완전히 임의적 인 것으로 간주 될 수 있다면 나중에 뒤섞을 수 있습니다.) 변수에 대해 엄격한 총 순서를 부과하는 더 나은 결과를 얻을 수 있습니다 x1 ... x500. 예를 들어

    x1 < x2 /\ x2 < x3 /\ ... /\ x499 < x500
    
  • 사용 가능한 옵션 인 경우를 사용 하여 조기 정리 호출 의 빈도를 높일 z3수 있습니다 (참고 : z3이러한 호출을 얼마나 자주 수행 하는지 잘 모르겠습니다 ).

  • 이런 종류의 제약 조건으로 잘 작동 할 수있는 mcSAT시도해 볼 수 있습니다.


편집하다:

변수에 할당 할 수있는 값 집합 x_i이 유한하고 크기가 다소 제한되어있는 경우 카디널리티 제약을 정의하기 위해 x_i비표준 z3확장을 사용하여 특정 값을 가진 변수의 수를 계산할 수 있습니다.

(assert
    ((_ at-most 1)
     (= x1 0)
     (= x2 0)
     ...
     (= x500 0)
    )
)
...
% repeat for all possible values 
...

이 변경이 성능에 미치는 영향에 대해 잘 모르겠습니다. 정상적인 상황에서는 이전에 충돌하는 할당을 나타내므로 성능에 긍정적 인 영향을 미칩니다 (예 : [1] 참조 ). 그러나 상당히 많은 수의 변수와 변수에 대한 후보 값의 큰 도메인을 다루고 x_i있으므로 부울 수준에서 검색을 평탄화하는 것은 과잉 일 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

PHP 기본적으로 1000 개 이상의 변수가 POST 메서드를 확인하는 방법은 무엇입니까?

분류에서Dev

optuna에서 중복없이 매개 변수를 샘플링하는 방법은 무엇입니까?

분류에서Dev

중복 값이없고 대상 합계가있는 배열에서 4 개의 숫자 합계를 찾는 방법은 무엇입니까?

분류에서Dev

이 중첩 된 개체를 반복하는 방법은 무엇입니까?

분류에서Dev

1000 개의 PDF를 구성하는 방법은 무엇입니까?

분류에서Dev

2 개 이상의 for 루프를 반복하고 인쇄하는 방법은 무엇입니까?

분류에서Dev

중복 헤더없이 개체를 표시하는 방법은 무엇입니까?

분류에서Dev

중복없이 2 개의 외래 키로 테이블을 조인하는 방법은 무엇입니까?

분류에서Dev

중복 열없이 3 개의 테이블을 조인하는 방법은 무엇입니까?

분류에서Dev

개체를 병합하고 중복 개체의 일부 값을 합산하는 방법은 무엇입니까?

분류에서Dev

각 노드에 두 개 이상의 잎이있는 트리를 복사하는 방법은 무엇입니까?

분류에서Dev

각 노드에 두 개 이상의 잎이있는 트리를 복사하는 방법은 무엇입니까?

분류에서Dev

Cognos Report Studio에서 모든 중복 값의 고유 한 개수를 만드는 방법은 무엇입니까?

분류에서Dev

ColdFusion에서 BULK 삽입을 사용하지 않고 한 번에 1000 개 이상의 레코드를 삽입하는 방법은 무엇입니까?

분류에서Dev

중복 키 값없이 array.push () 함수로 배열을 복사하는 방법은 무엇입니까?

분류에서Dev

두 개 이상의 반복 된 : punct : 파이썬에서 re를 사용하는 방법은 무엇입니까?

분류에서Dev

매개 변수의 매개 변수가 존재하는지 확인하는 방법은 무엇입니까?

분류에서Dev

매개 변수의 매개 변수가 존재하는지 확인하는 방법은 무엇입니까?

분류에서Dev

firebase (Firestore 및 Storage)를 사용하여 1000 개 이상의 이미지로 워드 문서 (docx)를 생성하는 방법은 무엇입니까?

분류에서Dev

CNN이 매개 변수를 줄이고 가중치를 재사용하는 방법은 무엇입니까?

분류에서Dev

서버 측 PHP에서 두 개 이상의 이미지를 중첩하는 방법은 무엇입니까?

분류에서Dev

실제로 사용중인 공개 키를 확인하고 더 이상 사용되지 않는 키 (gpg)를 제거하는 방법은 무엇입니까?

분류에서Dev

중복 값없이 열을 복사하는 방법은 무엇입니까? SQL

분류에서Dev

세 개 이상의 목록을 반복하여 각 요소를 비교하는 방법은 무엇입니까?

분류에서Dev

FOR 루프를 사용하여 26 개 이상의 변수를 할당하는 방법은 무엇입니까?

분류에서Dev

os.makedirs의 매개 변수를 확인하는 방법은 무엇입니까?

분류에서Dev

반복자 체인이 for_each ()를 수행하고 개수를 반환하는 방법은 무엇입니까?

분류에서Dev

Trello 보드에서 1000 개 이상의 액션을 얻는 방법은 무엇입니까?

분류에서Dev

현재 줄 위 / 아래에 1000 개 이상의 줄을 읽는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    PHP 기본적으로 1000 개 이상의 변수가 POST 메서드를 확인하는 방법은 무엇입니까?

  2. 2

    optuna에서 중복없이 매개 변수를 샘플링하는 방법은 무엇입니까?

  3. 3

    중복 값이없고 대상 합계가있는 배열에서 4 개의 숫자 합계를 찾는 방법은 무엇입니까?

  4. 4

    이 중첩 된 개체를 반복하는 방법은 무엇입니까?

  5. 5

    1000 개의 PDF를 구성하는 방법은 무엇입니까?

  6. 6

    2 개 이상의 for 루프를 반복하고 인쇄하는 방법은 무엇입니까?

  7. 7

    중복 헤더없이 개체를 표시하는 방법은 무엇입니까?

  8. 8

    중복없이 2 개의 외래 키로 테이블을 조인하는 방법은 무엇입니까?

  9. 9

    중복 열없이 3 개의 테이블을 조인하는 방법은 무엇입니까?

  10. 10

    개체를 병합하고 중복 개체의 일부 값을 합산하는 방법은 무엇입니까?

  11. 11

    각 노드에 두 개 이상의 잎이있는 트리를 복사하는 방법은 무엇입니까?

  12. 12

    각 노드에 두 개 이상의 잎이있는 트리를 복사하는 방법은 무엇입니까?

  13. 13

    Cognos Report Studio에서 모든 중복 값의 고유 한 개수를 만드는 방법은 무엇입니까?

  14. 14

    ColdFusion에서 BULK 삽입을 사용하지 않고 한 번에 1000 개 이상의 레코드를 삽입하는 방법은 무엇입니까?

  15. 15

    중복 키 값없이 array.push () 함수로 배열을 복사하는 방법은 무엇입니까?

  16. 16

    두 개 이상의 반복 된 : punct : 파이썬에서 re를 사용하는 방법은 무엇입니까?

  17. 17

    매개 변수의 매개 변수가 존재하는지 확인하는 방법은 무엇입니까?

  18. 18

    매개 변수의 매개 변수가 존재하는지 확인하는 방법은 무엇입니까?

  19. 19

    firebase (Firestore 및 Storage)를 사용하여 1000 개 이상의 이미지로 워드 문서 (docx)를 생성하는 방법은 무엇입니까?

  20. 20

    CNN이 매개 변수를 줄이고 가중치를 재사용하는 방법은 무엇입니까?

  21. 21

    서버 측 PHP에서 두 개 이상의 이미지를 중첩하는 방법은 무엇입니까?

  22. 22

    실제로 사용중인 공개 키를 확인하고 더 이상 사용되지 않는 키 (gpg)를 제거하는 방법은 무엇입니까?

  23. 23

    중복 값없이 열을 복사하는 방법은 무엇입니까? SQL

  24. 24

    세 개 이상의 목록을 반복하여 각 요소를 비교하는 방법은 무엇입니까?

  25. 25

    FOR 루프를 사용하여 26 개 이상의 변수를 할당하는 방법은 무엇입니까?

  26. 26

    os.makedirs의 매개 변수를 확인하는 방법은 무엇입니까?

  27. 27

    반복자 체인이 for_each ()를 수행하고 개수를 반환하는 방법은 무엇입니까?

  28. 28

    Trello 보드에서 1000 개 이상의 액션을 얻는 방법은 무엇입니까?

  29. 29

    현재 줄 위 / 아래에 1000 개 이상의 줄을 읽는 방법은 무엇입니까?

뜨겁다태그

보관