귀하의 접근 방법은 다소 혼란 스럽지만 훨씬 간단 할 수 있습니다. 나는 이것을 좋아할 것입니다
sig Node{
next : lone Node
}
one sig Head in Node {} -- head node is still a node
fact{
all n : Node | n not in n.^next -- no cycles
no next.Head -- no node points to Head
all n : Node - Head | some next.n -- for all other nodes, there has to be someone pointing to them
}
run {} for 10
이 모델은 동적입니다. 모델을 동적으로 만들려면 상태 개념을 이해해야합니다. Alloy의 저자가 작성한 Software Abstractions을 읽어 보시기 바랍니다. 연결된 목록을 동적으로 접근하는 것은 너무 복잡하여이 시점에서 이해할 수 없으므로 간단한 연습을해야합니다.
정적 예 :
sig State {}
abstract sig Target {}
sig Email extends Target {}
abstract sig Name extends Email {
name : set State,
addr : Target some -> State
}
sig Group, Alias extends Name {}
fact {
all a : Alias | lone a.addr
no n : Name | n in n.^addr
}
run {}
동적 예를 들어, 로컬 상태 관용구 (= 표현하는 방법으로
국가의 기본 아이디어는 (책에 address book 예에 따라 운동)입니다 각주의 관용구와 사건 관용어도있다). 당신은 또한 다음과 같은 slides 좀 걸릴 수 있습니다 술어
open util/ordering[State]
sig State {}
abstract sig Target {}
sig Email extends Target {}
abstract sig Name extends Email {
name : set State,
addr : Target -> State
}
sig Group, Alias extends Name {}
fact {
all s : State {
all a : Alias & name.s | lone a.addr.s
no n : name.s | n in n.^(addr.s)
addr.s in name.s -> Target
addr.s :> Name in Name -> name.s
}
}
run {} for 3 but exactly 1 State
-- adding a name n, for a given pre state s and post state s'
pred addName [n : Name, s,s' : State] {
-- the name must not exist in the pre state
n not in name.s
-- the relation names in the post state is what is was
-- in the pre state in addition to the new name
name.s' = name.s + n
-- the address relation stays the same
addr.s' = addr.s
}
run addName for 3 but 2 State
pred addTarget [n : Name, t : Target, s,s' : State] {
t not in n.addr.s
name.s' = name.s
addr.s' = addr.s + n->t
}
run addTarget for 3 but 2 State
를 살펴 보자.
감사 chritiano. Software Abstractions라는 책을 찾았습니다. 현재 당면한 다른 업무에 우선 순위 부여. 오늘 또는 내일 시도 할 것입니다. 고마워요 톤 : –