1. ホーム
  2. prolog

[解決済み] "シンタックスエラー。Prologで「演算子が期待されています。

2022-01-31 23:15:33

質問

Prologでデータフローを表現したグラフ構造があります。

  • ノード1から2へ、1から3へ、といったエッジがありますね。
  • ノード1には変数x、ノード4には変数tが定義されている、など。
  • 変数dはノード4で、変数xはノード7で使用される、など。

関数 definition_clear_path を計算する必要があります。 定義クリアパス は、任意の変数の

これを実行すると、次のようなエラーが発生します。

definition_clear_path/3: Undefined procedure: definition_clear_path1/4
         However, there are definitions for:
               definition_clear_path/3

のルールを入力すると definition_clear_path1 をターミナルから表示します。 Syntax error: Operator expected . なぜ?

edge(1, 2).
edge(1,3).
edge(3,7).
edge(3,4).
edge(4,6).
edge(4,5).
edge(7,x).
def(p,1).
def(e,1).
def(d,1).
def(x,1).
def(c,1).
def(d,4).
def(t,4).
def(c,5).
def(x, 6).
def(c,6).
use(d,3).
use(e,3).
use(d,4).
use(c,4).
use(x,4).
use(t,4).
use(c,5).
use(x,6).
use(c,6).
use(d,6).
use(x,7).
pos_path(X,Y, [X,Y]):- edge(X,Y).
pos_path(Start, End, [Start|T]) :- edge(Start,Mid), pos_path(Mid, End, T).


definition_clear_path( Node , J , Var ):- definition_clear_path1( Node , J , Var , [    Node ] ) .

definition_clear_path1(B , J, K , F):- edge (B , J ).

definition_clear_path1( Node , J , Var , L):- 
edge ( Node , N1 ) ,
not(def( Var , N1 )) ,
not(use( Var , N1 )) ,
definition_clear_path1( N1 , J , Var , [ Node | L ] ) .

解決方法は?

の間のスペースを削除します。 edge と冒頭の括弧を削除します。

スペースは用語を区切りますので、Prologは次のように考えます。 edge は複合項のファンクタではなく、演算子である。