мне нужно смоделировать структуру углеводорода, используя сплав, в основном мне нужно спроектировать алкановые, алкеновые и алкиновые группы, которые я создал следующие сигнатуры (пример алкена)
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.Что нужно написать, чтобы это работало для алкана
alkenegrp
, а этот новый факт, который вы хотите добавить, говорит оalkynegrp
, поэтому мне нелегко его проверить. Если вы дадите мне конкретную модель, которую я могу запустить, и объясните мне, почему вы думаете, что она не работает, то, скорее всего, я смогу помочь. Кстати,#(a.c)
в вашем факте всегда будет оцениваться как1
, посколькуc
равноone Carbon
. - person Aleksandar Milicevic   schedule 25.03.2013