我需要用合金模拟碳氢化合物结构 基本上我需要设计烷烃,烯烃和炔烃基团 我创建了以下签名(alkene示例)
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
ë
烷烃的通式是C n H 2n + 2 ,对于乘法我们可以使用mul内置函数但是我们不能写因为我们必须做C n H 2n + 2 。我们应该写什么以便它可以用于烷烃
答案 0 :(得分:3)
我现在对烷烃,烯烃和炔烃的了解要好一些,但我仍然不明白为什么你认为你的Alloy模型不起作用。
要表达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 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实际上做了什么。