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です(非環状構造を仮定)。アルカンともいう。不飽和炭化水素には、炭素原子間に 1 つ以上の二重結合または三重結合があります。二重結合を持つものはアルケンと呼ばれます。1 つの二重結合を持つものは、式 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 nc: one Carbon ) からに変更する必要がありますc: set Carbon。次に述語を実行するとshow_alkane、炭素の数が 1 より大きく、水素の数が 0 よりも大きいインスタンスがいくつか得られるはずです。

また、アルカン式については

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

a.cが空でない場合、少なくとも 4 つの水素原子が必要になるため、デフォルトのスコープ 3 では十分ではありませんが、スコープを明示的に指定することで修正できます。

run show_alkane for 8

これがあなたが話していた問題でない場合は、「うまくいかない」と思う理由をより具体的に教えてください。つまり、Alloy に何を期待していて、Alloy が実際に何をしているのかを教えてください。

于 2013-04-12T15:03:59.603 に答える