1

我需要使用合金模拟碳氢化合物结构基本上我需要设计烷烃、烯烃和炔烃基团我创建了以下签名(烯烃示例)

sig Hydrogen{}
sig Carbon{}
sig alkenegrp{
    c:one Carbon,
    h:set Hydrogen,
    doublebond:lone alkenegrp
}
sig alkene{
    unit : set alkenegrp
}
fact{
    all a:alkenegrp|a not in a.doublebond.*doublebond
    all a:alkenegrp|#a.h=mul[#(a.c),2]
}
pred show_alkene{
    #alkene>1
}
run show_alkene

这适用于烯烃,但是当我尝试通过改变所有 a:alkynegrp|#ah=minus[mul[#(ac),2],2]的事实来为烷烃或炔烃设计相同的东西时,它不起作用。谁能建议我如何实现它?

我的问题陈述是在有机化学中饱和碳氢化合物是完全由单键组成的有机化合物,并被氢饱和。饱和烃的通式是 C n H 2n+2(假设非环状结构)。也称为烷烃。不饱和烃在碳原子之间具有一个或多个双键或三键。具有双键的称为烯烃。具有一个双键的那些具有式 C n H 2n(假设非环状结构)。含有三键的称为炔烃,通式为C n H 2n-2。模拟碳氢化合物并给出谓词以生成烷烃、烯烃和炔烃的实例。我们尝试过:

sig Hydrogen{}
sig Carbon{}

sig alkane{
c:one Carbon,
h:set Hydrogen,
n:lone alkane
}

fact{
//(#h)=add [mul[(#c),2],2]
//all a:alkane|a not in a.*n
all a:alkane|#a.h=mul[#(a.c),2]
}
pred show_alkane(){}

run show_alkan

e

烷烃的一般公式是 C n H 2n+2,对于乘法,我们可以使用 mul 内置函数,但我们不能写加法,因为我们必须做 C n H 2n+2。我们应该写什么才能使它适用于烷烃

4

1 回答 1

3

我现在对烷烃、烯烃和炔烃有了更好的了解,但我仍然不明白为什么你认为你的合金模型不起作用。

要表达 C n H 2n-2约束,您当然可以写出您建议的内容

all a:alkynegrp |
   #a.h = minus[mul[#(a.c), 2], 2]

问题只是在您alkane所说的 sig 声明中c: one Carbon,这会将碳原子的数量固定为 1,因此minus[mul[#(a.c), 2], 2]总是会计算为 0。我假设您想为任意数量的碳合金(因为 C n ) 所以你应该把它从 更改c: one Carbonc: set Carbon。如果您然后运行show_alkane谓词,您应该得到一些碳数大于 1 的实例,因此氢数大于 0。

此外,对于烷烃式

all a:alkynegrp |
   #a.h = plus[mul[#(a.c), 2], 2]

默认范围 3 是不够的,因为当a.c非空时您将需要至少 4 个氢原子,但您可以通过显式给出范围来解决此问题

run show_alkane for 8

如果这不是您所说的问题,请更具体地说明您认为“它不起作用”的原因,即您期望 Alloy 做什么以及 Alloy 实际上做什么。

于 2013-04-12T15:03:59.603 回答