expand_term(+入力項,-出力項) phrase(+ゴール,?リスト) xxxx
expand_term/2は、IF/Prologがファイルのコンサルト/コンパイル時に文法規則を通常のPrologの節に変換するのに使用します。
IF/Prologaは標準Prologに準拠するように、ユーザパラメータの後に2つの内部リストパラメータをつけ加えます。
phrase/2は、文法規則によって生成されたPrologの節を呼び出す場合に使用します。この方が直接呼び出すよりも移植性があります。
?- expand_term((a --> r1; r2), T).
T = a(_163,_165) :- r1(_163,_165) ; r2(_163,_165)
yes ?- _
以下の例題を実行するには、まず次のテキストをコンサルトして下さい。
expr(Z) --> term(X), "+", expr(Y), {Z is X+Y}. expr(Z) --> term(X), "-", expr(Y), {Z is X-Y}. expr(Z) --> term(Z).
term(Z) --> signed_number(X), "*", term(Y), {Z is X*Y}. term(Z) --> signed_number(X), "/", term(Y), {Z is X/Y}. term(Z) --> "(", expr(Z), ")". term(Z) --> signed_number(Z).
signed_number(C) --> number(0,C). signed_number(C) --> "+", number(0,C). signed_number(C"-", number(0,X), {C is -X}.
number(0,C) --> digit(Y), {C1 is 0*10+Y}, number(C1,C). number(X,X) --> !.
digit(X) --> [C], {"0"= ?- phrase(expr(X),"12+3*(4+5)").
X = 39
yes
?- listing(digit).
digit(X,[C|_261],_261) :-
[48] =< C ,
C =< [57] ,
X is C - [48] .
yes
?- _
Up
read on...
scroll to top