2017-12-10 18 views
0

의 유한 집합 다음은 정수의 집합을 나타내는 합금 모델입니다. 02에 어떻게 통합시킬 수 있습니까? 02은 (는) 세트가 아닙니다. 나는 조합 운영자가 세트에만 적용되는 줄 알았습니까? 이것이 조합의 기본 개념을 위반하지 않습니까?모델의 정수

두 번째 질문 :이 모델을 만드는 더 좋은 방법이 있습니까?인지 적으로 덜 거슬리는 것입니까?

one sig List { 
    numbers: set Int 
} { 
    numbers = 0 + 2 + 4 + 6 
} 

답변

1

합금에서 작업하는 모든 것은 튜플 세트입니다. none은 빈 세트이며, 많은 세트가 릴레이션 세트 (arity가 1보다 큰 튜플)입니다. 또한 각 정수는 여러분이 그것을 사용할 때, 1과 릴레이션 1의 관계를 가진 집합입니다. 당신이 1을 사용할 때 그것은 원자 1을 포함하는 타입의 집합 인 정말로 {(1)}입니다. 정의처럼 현실입니다 : 합금에

 enum Int {-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7} 

의 int 원자의 유한 집합이 문제는 일반적으로하지 않습니다 :-(다만 아주 좋지 않다 정수가 있지만 INTS으로 정말 유용 할 그들 중 아주 소수가 있습니다 . 더 나쁜, 그들은 신속하게 오버 플로우 및 합금은이 모든 것을 취급 좋지 않다.

하지만 그것은 추한 보인다. 내가 서열과 더 나쁜 문제가 동의.

 0-A + 1->B + 2->C + 3->C 

이미 추가 실험 literal seq를 Alloy로 가져가 실험 버전을 실행 중입니다.

 // does not work in Alloy 4 
    seq [ A, B, C, C ] = 0->A + 1->B + 2->C + 3->C 
    set [ 1, 2, 3, 3 ] = 1+2+3 

오늘이 작업을 수행 할 수 있습니다 : 수 세트는이 방법으로 구현 될 수

let x[a , b ] = { a + b } 

run { 
    x[1,x[2,x[3,4]]] = 1+2+3+4 
} for 4 int 

을하지만하지 않도록 내가 더 나은이를 좋아한다. 매크로는 메타 필드 것 또는 시퀀스 (대부분의 통역을 가지고있는 것처럼)과 인수를 사용할 수 있도록 할 경우, 우리는 seq [ A, B, C, C ] 구문이 마음이

// does not work in Alloy 4 
let list[ args ... ] = Int.args // args = seq univ 
run { 
    range[ list[1,2,3,4,4] ] = 1+2+3+4 
} 

을 할 수 또는 변수 인수는 다음 AlloyTools 목록에 스레드를 시작 . 말씀 드린대로 seq [ A, B, C, C ]이 프로토 타입으로 작동합니다.

+0

안녕하세요 @Peter Kriens, 우수 게시자 주셔서 감사합니다. 질문 : Alloy가 1 차 논리를 사용한다는 것을 기억합니다. "first order logic"은 세트가 세트를 포함 할 수 없다는 의미입니다. 즉, 세트의 멤버는 세트가 될 수 없습니다. 그렇다면 Int 세트에 {0} 세트, {1} 세트 등이 포함될 수 있습니까? Alloy가 1 차 논리를 사용한다는 진술을 위반하지 않습니까? –

+1

음, 테이블 내에서 원자는 원자입니다. 'Int = {(0), (1), 등}'. 그러나이 원자에 액세스하는 API는 없습니다. 모든 연산은 항상이 '테이블'(튜플 세트)에 정의됩니다. 나는. 결합, 결합, 추가 등. 이러한 모든 연산의 결과는 또 다른 테이블입니다. 따라서 하나의 원자를 제공하는 연산이 없으며 항상 결과를 테이블에 래핑합니다. 이 모델에 대한 좋은 점은 응답이 비어있을 수 있기 때문에 null 원자가 필요하지 않다는 것입니다. –

+1

@Roger 각 정수는 원자입니다. 세트가 아닙니다. 베드로가 의미 한 바는 집합 연산자가 주어진 원자를 단일 원소 (하나의 원소를 포함하는 집합)로 볼 수 있다는 의미에서 원자와 함께 사용할 수 있다는 것입니다. –