합금에서 작업하는 모든 것은 튜플 세트입니다. 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 ]
이 프로토 타입으로 작동합니다.
안녕하세요 @Peter Kriens, 우수 게시자 주셔서 감사합니다. 질문 : Alloy가 1 차 논리를 사용한다는 것을 기억합니다. "first order logic"은 세트가 세트를 포함 할 수 없다는 의미입니다. 즉, 세트의 멤버는 세트가 될 수 없습니다. 그렇다면 Int 세트에 {0} 세트, {1} 세트 등이 포함될 수 있습니까? Alloy가 1 차 논리를 사용한다는 진술을 위반하지 않습니까? –
음, 테이블 내에서 원자는 원자입니다. 'Int = {(0), (1), 등}'. 그러나이 원자에 액세스하는 API는 없습니다. 모든 연산은 항상이 '테이블'(튜플 세트)에 정의됩니다. 나는. 결합, 결합, 추가 등. 이러한 모든 연산의 결과는 또 다른 테이블입니다. 따라서 하나의 원자를 제공하는 연산이 없으며 항상 결과를 테이블에 래핑합니다. 이 모델에 대한 좋은 점은 응답이 비어있을 수 있기 때문에 null 원자가 필요하지 않다는 것입니다. –
@Roger 각 정수는 원자입니다. 세트가 아닙니다. 베드로가 의미 한 바는 집합 연산자가 주어진 원자를 단일 원소 (하나의 원소를 포함하는 집합)로 볼 수 있다는 의미에서 원자와 함께 사용할 수 있다는 것입니다. –