スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【同じタグを付けた記事の一覧】

Prolog の組み込み演算子一覧が欲しい

2015年04月12日(日)20時19分

Prolog の述語と演算子

前回「Prolog の組み込み述語一覧が欲しい」において、Prolog の各処理系が持つ組み込み述語一覧を「current_predicate/1」で取得したわけですが、よく見るとそこには「演算子」の定義が含まれていませんでした。
自分はこれまで、「Prolog の演算子は、述語の特殊表記である」と、漠然と考えていました。
つまり、例えば「足し算」であれば、まず「’+’(A,B) :- ~」のような述語定義があり、それを「op/3」によって「前置」や「中置」といった、特殊な形式で表記できるように変更しているだけだと思っていたわけです。
そして、「述語」である以上は、「current_predicate/1」で取得される述語一覧の中に、当然「演算子」も含まれると考えていたのです。

演算子は述語ではない?

が、今回の事態を受けてよく考えてみると、Prolog における「述語」というのは「命題」ですから、それは「真か偽のどちらかに定まる文章」ということになります。
すなわち、「述語」の戻り値は「yes」か「no」のどちらかであり、つまり前述の「足し算」の定義では、「答え」を受け取る余地がないということです。
そう考えると、「op/3」というのは、自分が思っていたような「述語がとる引数の記述位置を変更する」といったものではなく、「何らかの値を返す関数を作る」という、何か別の特殊な機能なのかもしれません。

current_op/3

…と、まあそれはそうとして、今回の目的は「テキストエディタ Mery 用 Prolog ソースコード着色設定ファイルの作成」ですので、そのためには「演算子一覧」も、ぜひとも入手したいところです。
で、調べてみますと「current_op/3」という、「current_predicate/1」の演算子版があり、これを使用して取得した各処理系の演算子一覧をまとめて表にしてみました(末尾に記載)。

制約論理

まとめてみますと、「AZ-Prolog」と「GNU Prolog」に、「#」から始まる演算子が多数登録されていることがわかります。
少し調べてみたところ、これはどうも「制約論理プログラミング」に使用するものらしく、「AZ-Prolog」と「GNU Prolog」には、これが拡張ライブラリ等ではなく、標準で組み込まれているようです。

「=<」と「>=」

それと、今回の話には関係がないのですが、Prolog で「以下」「以上」を示す比較演算子である「=<」「>=」ですが、これがどうして順番に規則性がないのかと、ずっと疑問に感じていました。
C言語や JavaScript では「<=」「>=」となっており、これは「小なりイコール」「大なりイコール」の読み方とも一致していて覚えやすく、また、「ノットイコール」である「!=」なども合わせて統一感もあります。
それがなぜ、Prolog ではこんなことになっているのか?
で、今回 Prolog の演算子についていろいろと調べている中で、このことについて「矢印にならないようにしてある」という、非常に説得力のある記述を見つけ、「なるほど!」と納得がいったのです。
確かに、見た目が「矢印」のようだと「代入記号」的な勘違いも受けやすいでしょうし、また、独自に何かしらの代入的な概念をもつ拡張を行うような場合にも、「矢印に見える記号の組み合わせが空いている」というのは、いろいろと便利なはずで、これはよく考えられたものだったのだなと、感動すら覚えました(少し大袈裟ですが)。
まあ、普通の Prologer(Prologist?)からすれば、こんなことは当たり前の常識なのかもしれませんが。

演算子一覧

  AZ GNU SWI YAP  
#       500 yfx
##   730     xfy
### 1150       fx
#/\   720     yfx
#< 700 700     xfx
#<#   700     xfx
#<=>   750     xfy
#= 700 700     xfx
#=#   700     xfx
#=< 700 700     xfx
#=<#   700     xfx
#==>   740     xfy
#> 700 700     xfx
#>#   700     xfx
#>= 700 700     xfx
#>=#   700     xfx
#\   710     fy
#\/   730     yfx
#\/\   720     yfx
#\<=>   750     xfy
#\= 700 700     xfx
#\=#   700     xfx
#\==>   740     xfy
#\\/   730     yfx
$     1   fx
* 400 400 400 400 yfx
** 200 200 200 200 xfx
*->   1050 1050 1050 xfy
+ 200 200 200 200 fy
+ 500 500 500 500 yfx
, 1000 1000 1000 1000 xfy
- 200 200 200 200 fy
- 500 500 500 500 yfx
--> 1200 1200 1200 1200 xfx
-> 1050 1050 1050 1050 xfy
.       999 xfy
.. 560       yfx
/ 400 400 400 400 yfx
// 400 400 400 400 yfx
/== 700       xfx
/\ 500 500 500 500 yfx
: 550 600 600 600 xfy
:- 1200 1200 1200 1200 fx
:- 1200 1200 1200 1200 xfx
:: 580       xfy
:= 700   990   xfx
; 1100 1100 1100 1100 xfy
< 700 700 700 700 xfx
<< 400 400 400 400 yfx
= 700 700 700 700 xfx
=.. 700 700 700 700 xfx
=/= 700       xfx
=:= 700 700 700 700 xfx
=< 700 700 700 700 xfx
== 700 700 700 700 xfx
=@=     700 700 xfx
=\= 700 700 700 700 xfx
> 700 700 700 700 xfx
><       500 yfx
>= 700 700 700 700 xfx
>> 400 400 400 400 yfx
?     250   yfx
?- 1200   1200 1200 fx
@     200   fy
@< 700 700 700 700 xfx
@=< 700 700 700 700 xfx
@> 700 700 700 700 xfx
@>= 700 700 700 700 xfx
\ 200 200 200 200 fy
\+ 900 900 900 900 fy
\/ 500 500 500 500 yfx
\= 700 700 700 700 xfx
\== 700 700 700 700 xfx
\=@=     700 700 xfx
^ 200 200 200 200 xfy
and 500       yfx
as     700 600 xfx
block       1150 fx
bltin 1150       fx
discontiguous     1150 1150 fx
div   400 400 400 yfx
dynamic 1150   1150 1150 fx
extern 1150       fx
help 1150       fy
in 580       xfx
index 1150       fx
initialization     1150 1150 fx
is 700 700 700 700 xfx
meta_predicate     1150 1150 fx
mod 400 400 400 400 yfx
mode 1150     1150 fx
module 1150       fy
module_transparent     1150 1150 fx
multifile     1150 1150 fx
nospy       900 fx
nospy 900       fy
not       900 fy
notin 580       xfx
or 500       yfx
public 1150   1150 1150 fx
rdiv     400 400 yfx
rem 400 400 400 400 yfx
same       50 xfx
spy       900 fx
spy 900       fy
thread_initialization     1150   fx
thread_local     1150 1150 fx
uncutable       1150 fx
volatile     1150 1150 fx
xor     400   yfx
|   1105 1105 1105 xfy
関連記事

【同じタグを付けた記事の一覧】
プログラミング Prolog Mery

スポンサーサイト

コメントの投稿

非公開コメント

最新記事
最新コメント
Amazonおまかせリンク
カテゴリ
タグクラウド
Amazonお買い得ウィジェット
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
月別アーカイブ
プロフィール

電脳太助

Author:電脳太助
Website:電脳スピーチ web

RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

サイト内検索
Ads by Google
FC2アクセスランキング
Ads by Google
FC2拍手ランキング
ユーザータグ

音楽管理(66)
ポータブル(57)
ソフト紹介(44)
プログラミング(42)
音声技術(41)
自作ソフト(35)
サイト運営(32)
FC2(31)
ブログ(30)
iTunes(27)
Windows(25)
LISMO(24)
音声合成(23)
音声認識(22)
x-アプリ(22)
電子ブック(22)
eラーニング(20)
バックアップ(19)
語学学習(19)
foobar2000(18)
ソースコード(18)
WindowsLiveWriter(15)
画像管理(15)
C++(14)
アフィリエイト(10)
DnspTools(10)
fi-6130(9)
FLAC(9)
JavaScript(9)
ウォークマン(9)
英語音読学習計画(8)
Gracenote(8)
Prolog(8)
ベクター(8)
雑記(8)
CodeBlocks(7)
SyntaxHighlighter(7)
TraConv(7)
spcbght(7)
wxWidgets(7)
VirtualBox(6)
W63CA(6)
DCP-J552N(6)
WinRT(6)
WindowsLiveMesh(6)
iGoinLM(6)
英語発音矯正実験(6)
ExactAudioCopy(6)
MP3Gain(6)
LAME(5)
音楽技術(5)
Mery(5)
楽器演奏(5)
GalateaTalk(4)
nLite(4)
WindowsLiveSkyDrive(4)
ホームページ(4)
GalateaProject(4)
MIDI(4)
LLVM(4)
PC-98(3)
カウンター(3)
AACGain(3)
iTCDini(3)
OverCutChecker(3)
拍手(3)
PK-513L(3)
UniversalExtractor(3)
アクセスランキング(3)
ImageCompositeEditor(2)
アクセス解析(2)
OCR(2)
qtaacenc(2)
資格試験(1)
AquesTalk(1)
AquesCmdDl(1)

FC2アクセスランキング
最新トラックバック
アクセスランキング
[ジャンルランキング]
コンピュータ
130位
アクセスランキングを見る>>

[サブジャンルランキング]
ソフトウェア
12位
アクセスランキングを見る>>
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。