Network programming 合金编程,例如网络配置

Network programming 合金编程,例如网络配置,network-programming,alloy,Network Programming,Alloy,假设有8台电脑和1台交换机,我想划分三个子网。如何使用alloy语言程序?你能举个例子吗?alloy是一种建模语言,主要用于设计推理。所以,忘掉“编程”吧 在Alloy中,您可以定义pc、交换机和子网之间相互关系的一般规则。然后,您可以验证这些规则是否允许将这些pc划分为三个子网,以及划分是否与您的体验相符。如果没有,恭喜,您在规范中发现了一个“bug”,解决它将提高您对当前建模系统固有约束的理解 Alloy是一种建模语言,主要用于对设计进行推理。所以,忘掉“编程”吧 在Alloy中,您可以定义

假设有8台电脑和1台交换机,我想划分三个子网。如何使用alloy语言程序?你能举个例子吗?

alloy是一种建模语言,主要用于设计推理。所以,忘掉“编程”吧


在Alloy中,您可以定义pc、交换机和子网之间相互关系的一般规则。然后,您可以验证这些规则是否允许将这些pc划分为三个子网,以及划分是否与您的体验相符。如果没有,恭喜,您在规范中发现了一个“bug”,解决它将提高您对当前建模系统固有约束的理解

Alloy是一种建模语言,主要用于对设计进行推理。所以,忘掉“编程”吧


在Alloy中,您可以定义pc、交换机和子网之间相互关系的一般规则。然后,您可以验证这些规则是否允许将这些pc划分为三个子网,以及划分是否与您的体验相符。如果没有,恭喜,您在规范中发现了一个“bug”,解决它将提高您对当前建模系统固有约束的理解

以下模型是一个小型网络

sig IP {}

some sig Subnet {
    range   : some IP
}

abstract sig Node {
    ips     : some IP
}

sig Router extends Node {
    subnets : IP -> lone Subnet
} {
    ips = subnets.Subnet
    all subnet : Subnet {
        lone subnets.subnet
        subnets.subnet in subnet.range
    }
}

sig PC extends Node {} {
    one ips
}


let routes = { disj s1, s2 : Subnet | some r : Router | s1+s2 in r.subnets[IP] }
let subnet[ip] = range.ip
let route[a,b] = subnet[a]->subnet[b] in ^ routes 

fact NoOverlappingRanges    { all ip : IP |  one range.ip }
fact DHCP           { all disj a, b : Node | no (a.ips & b.ips) }
fact Reachable          { all disj a, b : IP | route[a,b] }

run {
    # PC = 8
    # Subnet = 3
    # Router = 1
} for 12
如果您运行它:

┌───────────┬────────────┐
│this/Router│subnets     │
├───────────┼────┬───────┤
│Router⁰    │IP² │Subnet¹│
│           ├────┼───────┤
│           │IP³ │Subnet⁰│
│           ├────┼───────┤
│           │IP¹¹│Subnet²│
└───────────┴────┴───────┘

┌───────────┬─────┐
│this/Subnet│range│
├───────────┼─────┤
│Subnet⁰    │IP³  │
│           ├─────┤
│           │IP⁴  │
├───────────┼─────┤
│Subnet¹    │IP¹  │
│           ├─────┤
│           │IP²  │
│           ├─────┤
│           │IP⁵  │
│           ├─────┤
│           │IP⁶  │
│           ├─────┤
│           │IP⁷  │
│           ├─────┤
│           │IP⁸  │
│           ├─────┤
│           │IP⁹  │
│           ├─────┤
│           │IP¹⁰ │
├───────────┼─────┤
│Subnet²    │IP⁰  │
│           ├─────┤
│           │IP¹¹ │
└───────────┴─────┘

┌─────────┬────┐
│this/Node│ips │
├─────────┼────┤
│PC⁰      │IP¹⁰│
├─────────┼────┤
│PC¹      │IP⁹ │
├─────────┼────┤
│PC²      │IP⁸ │
├─────────┼────┤
│PC³      │IP⁷ │
├─────────┼────┤
│PC⁴      │IP⁶ │
├─────────┼────┤
│PC⁵      │IP⁵ │
├─────────┼────┤
│PC⁶      │IP⁴ │
├─────────┼────┤
│PC⁷      │IP¹ │
├─────────┼────┤
│Router⁰  │IP² │
│         ├────┤
│         │IP³ │
│         ├────┤
│         │IP¹¹│
└─────────┴────┘
您可能想查看将哪些PC分配到哪个子网。然后转到evaluator并键入:

ips.~range

┌───────┬───────┐
│PC⁰    │Subnet¹│
├───────┼───────┤
│PC¹    │Subnet¹│
├───────┼───────┤
│PC²    │Subnet¹│
├───────┼───────┤
│PC³    │Subnet¹│
├───────┼───────┤
│PC⁴    │Subnet¹│
├───────┼───────┤
│PC⁵    │Subnet¹│
├───────┼───────┤
│PC⁶    │Subnet⁰│
├───────┼───────┤
│PC⁷    │Subnet¹│
├───────┼───────┤
│Router⁰│Subnet⁰│
│       ├───────┤
│       │Subnet¹│
│       ├───────┤
│       │Subnet²│
└───────┴───────┘

免责声明:这很快被黑客攻击到一起,因此可能会出现建模错误。

以下模型是一个小型网络

sig IP {}

some sig Subnet {
    range   : some IP
}

abstract sig Node {
    ips     : some IP
}

sig Router extends Node {
    subnets : IP -> lone Subnet
} {
    ips = subnets.Subnet
    all subnet : Subnet {
        lone subnets.subnet
        subnets.subnet in subnet.range
    }
}

sig PC extends Node {} {
    one ips
}


let routes = { disj s1, s2 : Subnet | some r : Router | s1+s2 in r.subnets[IP] }
let subnet[ip] = range.ip
let route[a,b] = subnet[a]->subnet[b] in ^ routes 

fact NoOverlappingRanges    { all ip : IP |  one range.ip }
fact DHCP           { all disj a, b : Node | no (a.ips & b.ips) }
fact Reachable          { all disj a, b : IP | route[a,b] }

run {
    # PC = 8
    # Subnet = 3
    # Router = 1
} for 12
如果您运行它:

┌───────────┬────────────┐
│this/Router│subnets     │
├───────────┼────┬───────┤
│Router⁰    │IP² │Subnet¹│
│           ├────┼───────┤
│           │IP³ │Subnet⁰│
│           ├────┼───────┤
│           │IP¹¹│Subnet²│
└───────────┴────┴───────┘

┌───────────┬─────┐
│this/Subnet│range│
├───────────┼─────┤
│Subnet⁰    │IP³  │
│           ├─────┤
│           │IP⁴  │
├───────────┼─────┤
│Subnet¹    │IP¹  │
│           ├─────┤
│           │IP²  │
│           ├─────┤
│           │IP⁵  │
│           ├─────┤
│           │IP⁶  │
│           ├─────┤
│           │IP⁷  │
│           ├─────┤
│           │IP⁸  │
│           ├─────┤
│           │IP⁹  │
│           ├─────┤
│           │IP¹⁰ │
├───────────┼─────┤
│Subnet²    │IP⁰  │
│           ├─────┤
│           │IP¹¹ │
└───────────┴─────┘

┌─────────┬────┐
│this/Node│ips │
├─────────┼────┤
│PC⁰      │IP¹⁰│
├─────────┼────┤
│PC¹      │IP⁹ │
├─────────┼────┤
│PC²      │IP⁸ │
├─────────┼────┤
│PC³      │IP⁷ │
├─────────┼────┤
│PC⁴      │IP⁶ │
├─────────┼────┤
│PC⁵      │IP⁵ │
├─────────┼────┤
│PC⁶      │IP⁴ │
├─────────┼────┤
│PC⁷      │IP¹ │
├─────────┼────┤
│Router⁰  │IP² │
│         ├────┤
│         │IP³ │
│         ├────┤
│         │IP¹¹│
└─────────┴────┘
您可能想查看将哪些PC分配到哪个子网。然后转到evaluator并键入:

ips.~range

┌───────┬───────┐
│PC⁰    │Subnet¹│
├───────┼───────┤
│PC¹    │Subnet¹│
├───────┼───────┤
│PC²    │Subnet¹│
├───────┼───────┤
│PC³    │Subnet¹│
├───────┼───────┤
│PC⁴    │Subnet¹│
├───────┼───────┤
│PC⁵    │Subnet¹│
├───────┼───────┤
│PC⁶    │Subnet⁰│
├───────┼───────┤
│PC⁷    │Subnet¹│
├───────┼───────┤
│Router⁰│Subnet⁰│
│       ├───────┤
│       │Subnet¹│
│       ├───────┤
│       │Subnet²│
└───────┴───────┘

免责声明:这很快就被黑客攻击到一起,因此可能会出现建模错误。

欢迎使用堆栈溢出。请阅读,采取,阅读,以及。最后学习如何创建堆栈。欢迎使用堆栈溢出。请阅读,采取,阅读,以及。最后,学习如何创建一个新的应用程序。我不确定我是否完全同意。你可以像你说的那样使用Alloy,但是你可以创建一个可以驱动网络配置的实例?我们缺少了一些使这变得简单的功能,但我认为这是合金的一个有趣的用途。没错,这绝对是可能的。让我做出反应的是“Alloy编程”,因为将Alloy作为编程语言的想法已经显示出困惑的迹象。谢谢你的评论。我不确定我是否完全同意。你可以像你说的那样使用Alloy,但是你可以创建一个可以驱动网络配置的实例?我们缺少了一些使这变得简单的功能,但我认为这是合金的一个有趣的用途。没错,这绝对是可能的。让我做出反应的是“合金编程”由于将Alloy作为编程语言的想法已经显示出混乱的迹象。谢谢你的评论。谢谢。当我使用Alloy Analyzer 4.1.0运行此程序时出现错误。错误是,仅允许在顶级段落中声明,以及如何解决它。我是Alloy语言的初学者。你能记下你的程序吗?谢谢再一次,你应该用合金5。我不认为记录这个项目是有用的,因为它主要是学习语言。Alloy非常可读(尽管很难写)。对此发表评论将在很大程度上取代已经存在的内容。请阅读Daniel Jackson的操作手册。如何在windows平台上运行alloy5?对于alloy4,我只需要在window命令下执行java-jar alloy4.jar。但是对于alloy5,我无法运行。对于注释程序,我想了解您的建模思想。谢谢您的建议。您可以在Alloy 4.2中运行此模型。在此处下载jar:并以与Alloy4.1thanks相同的方式启动它。当我使用alloy Analyzer 4.1.0运行此程序时,出现了一个错误。错误是LET声明只允许在顶级段落中使用,以及如何解决它。我是alloy语言的初学者。你能记下你的程序吗?再次感谢你应该使用alloy 5... . 我不认为记录这个项目是有用的,因为它主要是学习语言。Alloy非常可读(尽管很难写)。对此发表评论将在很大程度上取代已经存在的内容。请阅读Daniel Jackson的操作手册。如何在windows平台上运行alloy5?对于alloy4,我只需要在window命令下执行java-jar alloy4.jar。但是对于alloy5,我无法运行。对于注释程序,我想了解您的建模思想。谢谢您的建议。您可以在Alloy 4.2中运行此模型。在这里下载jar:并以与Alloy4.1相同的方式启动它