2

私はプロローグが初めてで、優先順位を変更してプロローグで演算子を再割り当てしようとしています。次の 4 つのエラーが発生しています。

 :-op(1000,yf,+).  %unary plus%
 :-op(1000,yf,-).   %unary minus%
 :-op(750,yfx,"%").   %modulo%

最初の 2 つで、次のような同様のエラーが表示されます。

warning: directive failed (op(1000,xf,+)) with exception (error(permission_error(create,operator,+),op/3))

モジュロ 1 でもエラー (別のエラー) が発生します%が、引用符で囲む必要がないためだと思われます (しかし、コメント マーカーと区別するにはどうすればよいでしょうか?)。

他の演算子 (加算演算子など:-op(500,yfx,+).) を再定義しましたが、問題はありません。上記の3つだけでエラーが発生します。

誰でもこれに光を当てることができますか?

ありがとう!

4

2 に答える 2

1

GNUPrologのドキュメントには次のように記載されています

アトムは複数の演算子定義(たとえば、+のような接頭辞と中置)を持つことができますが、アトムは中置と後置の両方の演算子定義を持つことはできません。

ここから、最初の2つの宣言のエラー。次に、指定子をに変更する必要がありますfy。モジュロ演算子は一重引用符で囲む必要があります。

于 2013-02-18T11:49:42.530 に答える
1

+後置演算子として定義しようとしています。ただし、+は中置演算子としても定義されており、標準では演算子を後置と中置の両方として定義することは許可されていません。本当にこれを行いたい場合は、最初に優先順位 0 を使用して中置演算子を定義解除する必要があります。

+ただし、やなどの標準演算子は変更しないことをお勧めします-。C、C++、C#、Java、Perl、PHP、Javascript などで演算子の優先順位を変更すると、プログラマーとしての生活が非常に悲惨なものになります。

%Prolog で演算子として使用することはお勧めできません:%コメントを開始します。演算子として使用したい場合は、'%'常に引用符で書く必要があります。Prolog はすでに演算子modとしてrem定義されています。それで十分ではないですか?

おそらく、ISO に完全に準拠している GNU Prolog を使用しているでしょう。他のプロローグでは、infix と postfix を同時に定義できます。#237を参照してください。しかし、それらの他のプロローグは、多くのことを異なる方法で行います。

一般的な注意事項: 初心者は、オペレーター テーブルを変更しないようにしてください。最初に標準演算子に慣れる必要があります。経験を積むと、既存の演算子よりも優先順位が似た新しい演算子のみを追加することを好むようになるでしょう。


: ISO/IEC 13211-1:1995 6.3.4.3 演算子、最後の段落:


同じ名前の中置演算子と後置演算子があってはなりません。

于 2013-02-18T11:47:37.683 に答える