【问题标题】:alloy model for hydrocarbons碳氢化合物合金模型
【发布时间】:2013-03-25 10:13:13
【问题描述】:

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

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

这适用于烯烃,但是当我尝试通过改变诸如 all a:alkynegrp|#a.h=minus[mul[#(a.c),2],2] 之类的事实来为烷烃或炔烃设计相同的 它不起作用。 谁能建议我如何实现它?

我的问题陈述是 在有机化学中,饱和烃是完全由单一物质组成的有机化合物 键并被氢饱和。饱和烃的通式为 CnH2n+2(假设非循环结构)。也称为烷烃。不饱和烃 碳原子之间有一个或多个双键或三键。有双键的是 称为烯烃。具有一个双键的分子式为 CnH2n(假设非环状 结构)。含有三键的称为炔烃,通式为CnH2n-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

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

【问题讨论】:

  • 我不知道你所说的“它不起作用”是什么意思。在此示例中,您只有alkenegrp 的签名,而您要添加的这个新事实与alkynegrp 相关,因此我很难对其进行测试。如果你给我一个我可以运行的具体模型,并告诉我为什么你认为它不起作用,那么我更有可能提供帮助。顺便说一句,#(a.c) 实际上总是会评估为1,因为cone Carbon
  • @AleksandarMilicevic 我已经编辑了问题

标签: alloy


【解决方案1】:

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

要表达CnH2n-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。我假设你想为任意数量的碳合金(因为 Cn)所以你应该把它从 c: one Carbon 更改为 c: 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 实际上做什么.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多