модель сплава для углеводородов

мне нужно смоделировать структуру углеводорода, используя сплав, в основном мне нужно спроектировать алкановые, алкеновые и алкиновые группы, которые я создал следующие сигнатуры (пример алкена)

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|#ah=minus[mul[#(ac),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.Что нужно написать, чтобы это работало для алкана


person Abhi    schedule 25.03.2013    source источник
comment
Я не знаю, что вы имеете в виду, говоря, что это не работает. Здесь, в этом примере, у вас есть подпись только для alkenegrp, а этот новый факт, который вы хотите добавить, говорит о alkynegrp, поэтому мне нелегко его проверить. Если вы дадите мне конкретную модель, которую я могу запустить, и объясните мне, почему вы думаете, что она не работает, то, скорее всего, я смогу помочь. Кстати, #(a.c) в вашем факте всегда будет оцениваться как 1, поскольку c равно one Carbon.   -  person Aleksandar Milicevic    schedule 25.03.2013
comment
@AleksandarMilicevic Я отредактировал вопрос   -  person Abhi    schedule 12.04.2013


Ответы (1)


Теперь я немного лучше понимаю алканы, алкены и алкины, но я все еще не понимаю, почему вы думаете, что ваша модель Alloy не работает.

Чтобы выразить ограничение 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 будет недостаточен, потому что вам потребуется как минимум 4 атома водорода, когда a.c не пусто, но вы можете исправить это, явно указав область действия

run show_alkane for 8

Если это не та проблема, о которой вы говорили, пожалуйста, уточните, почему вы думаете, что «это не работает», т. е. чего вы ожидаете от Alloy и что на самом деле делает Alloy.

person Aleksandar Milicevic    schedule 12.04.2013