bugfix> prolog > 投稿

ロジックスキルを向上させるために、多くのプロローグ演習を行っています。しかし、私は運動の要求にこだわっています。

私がしなければならないことは、演算子を定義することです 、という方法で:ユーザーがプロンプトを介してこの構文で複素数を入力した場合(だから私はread(X)演算子を使用する)

(4+ i 7) - (2+ i 3).

結果として得られます

2+ i 4

私はPrologで演算子を定義する方法を理解しました、私は勉強しましたop 演算子ですが、その減算操作が実際にどのように行われるのかわかりません

回答 1 件
  • 最初の問題は、 xfx  二項演算子を定義し、単項演算子が必要なため、次のような宣言が必要です。

    :- op(600, xf, i).
    
    

    2番目の問題は、Prologクエリプロンプトで算術式を入力すると、還元のようなものが自動的に発生する状況がないことです。見る:

    ?- 3 + 4 * 7.
    ERROR: Undefined procedure: (+)/2 (DWIM could not correct goal)
    ?- X = 3 + 4 * 7.
    X = 3+4*7.
    
    

    算術が評価されるようにするには、 is/2 を使用する必要があります  オペレーター:

    ?- X is 3 + 4 * 7.
    X = 31.
    
    

    is/2 を試してみてください  数値を式に関連付ける単なる別の述語として。 ISO Prologには is/2 の動作を変更する方法はありません ので、独自の評価述語を作成し、それを使用する必要があります。

    eval((A + B i) + (C + D i), E + F i) :- 
        E is A + C, 
        F is B + D.
    
    

    それができたら、通常の方法で使用できます。

    ?- eval((3 + 4 i) + (7 + 8 i), X).
    X = 10+12 i.
    
    

    ご覧のとおり、これはおそらく退屈になりますが、機能します。手作業で複雑な数値のより包括的なサポートを提供したい場合は、メタインタープリターの作成を検討する必要があります。

あなたの答え