Home フォーラム AZ-Prologサポート掲示板 AZ-Prologのシンタックスについて

1件の返信スレッドを表示中
  • 投稿者
    投稿
    • #58840
      kw
      ゲスト
      最新版のAZ-Prologでカッコ内に ->記号と
      一部のアトムを入れるとシンタックスエラーになります。
      バグでしょうか?
       
      AZ-Prolog Version 9.63 (Linux/x64) GCC 5.4.0
      Copyright (C) SOFNEC CO., LTD. 1987-2017/06/29
      ?- A = '=', A == '='.
      A   = =
      yes
      
      ?- A =
       '=', (A == '=').
      A   = =
      yes
      
      ?- A = 1, (A == 1 -> true).
      A   = 1
      yes
      
      ?- A = '=', (A == '=' -> true).
      Syntax error
       
      ?- A = '=', (A == '>' -> true).
      Syntax error
      
      ?- A = '=', (A == '<' -> true).
      Syntax error
      
      ?- A = '=', (A == = -> true).
      Syntax error
       
      ?- A = '=', (A == > -> true).
      Syntax error
      
      ?- A = '=', (A == < -> true).
      Syntax error
    • #58842
      WEBサイト管理者
      キーマスター

      お問い合わせありがとうございます。

      結論から言いますとオペレータの振舞いの取り決め(仕様)です。
      解決方法としてはオペレータ登録されているアトムは()で囲うこ とで そのアトムそのものとして扱われます。
       
       | ?-A = '=',(A== '=' -> true).
       Syntax error
       | ?-A = (=),(A==(=) -> true).
       A = =
       yes

      ====以下説明====
      1. A = B -> true.
      B がオペレータではないため OK

       

      2. A = == .
      = は infix として読み、== はオペレータであり、同様の強度(xfx,700)であるため、
      本来エラーになる筈だが、次 Token が終端があるため、オペレータ扱いにせず( POSTFIXでもない)、
      = (A,==) と理解するため OK

       

      3. A = == -> true.
      = infix として読み、== はオペレータであり、同様の強度(xfx,700)であり、
      次 Token(->)が終端 or 区切り文字ではないため NG

      つまり、= や == , > , < 等は xfx 700 で定義されているので入れ子にはならない。

       
      | ?-read(X),display(X).<br />
      |: A = B == C.<br />
      Syntax error ---- Backtrace<br />
      (read(X_9),display(X_9)) ?-
      and や or は yfx 500 で定義されているため入れ子になる。
       
      | ?-read(X),display(X).
      |: X is A and B or C.
      is(X_87,or(and(A_89,B_91),C_ 93))
      X = X_87 is A_89 and B_91 or C_93
      以下のようにすると、期待する動作となりますが、 オペレータの定義を
      変更することになるので先に記述した解決策が望ましいでしょう。
       
      | ?-op(700,xfy,=).
      yes
      | ?-op(700,xfy,==).
      yes
      
      | ?-read(X),display(X).
      |: A = == -> true.
      ->(=(A_84,==),true)
      X = A_84= == ->true
       

      ご確認ください。

1件の返信スレッドを表示中
  • フォーラム「AZ-Prologサポート掲示板」には新規投稿および返信を追加できません。
上部へスクロール