スポンサーサイト

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

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

Prolog の組み込み述語一覧が欲しい

2015年03月29日(日)18時08分

Mery と Prolog

以前「Mery(テキストエディタ)を 2.0.13.4111 にアップデート」で書きましたが、自分は Mery というテキストエディタを愛用しています。
ただ、存念ながらこの Mery には、Prolog に対応した編集モードが付属しておらず、つまり Prolog のソースコードの色分け表示に対応しておりません(少なくとも標準では)。

組み込み述語一覧が欲しい

「それなら自分で作ろう」と思ったのですが、Prolog は言語仕様が非常にシンプルで、他言語でいうところの「予約語」にあたるものがほとんどありません。
そのため、他言語の設定を引き写しにすると、どうにも「色分け」として寂しい感じになりますので、「組み込み述語(Built-ni Predicates)」も着色対象とすることにしました。
ということで、組み込み述語の一覧が必要になったわけです。
当初、Prolog の勉強も兼ねて、「各処理系の WEB サイトからコツコツと手作業で集める」ということも考えたのですが、せっかく PC を、しかもプログラミング言語を使っているのですから、まずはプログラマ的な手段で挑むことにしました。

SWI-Prolog

「とりあえずは自身のメイン環境である SWI-Prolog から」ということで、いろいろと調べながら、以下の二つの述語を定義した「fsa.pl」を「C:\Prolog\」フォルダに作りました。

functor_slash_arity(FsN) :-
	current_predicate(F/N),
	atom_concat(F,'/',Fs),
	atom_concat(Fs,N,FsN).

write_all_fsa(S) :-
	functor_slash_arity(X),
	write(S,X),
	nl(S),
	fail.

工夫すればもっと短く書くこともできるのかもしれませんが、汎用性を考慮して、出来るだけ ISO な述語を選択しています。
で、SWI-Prolog を起動し、

ensure_loaded('C:\\Prolog\\fsa.pl').

して

open('C:\\Prolog\\BuiltinPredSWI.txt',write,S),write_all_fsa(S),close(S).

すると、もくろみ通り組込み述語の一覧が取得できました。
それをアルファベット順に並べなおしたものが以下のファイルです。

AZ-Prolog

Prolog の ISO 標準規格は「最低限これくらいは必要」というものに絞ってあるようで、各処理系は、それ以外に便利な述語をいろいろと独自に搭載しています。
ということから、「SWI-Prolog だけを調べた程度では不十分」と言わざるを得ないため、次に AZ-Prolog の組み込み述語も見てみることにしました。
両者とも ISO 準拠ですから、前段で行った SWI-Prolog での手法がそのまま通るはず、と考えていたのですが、「fsa.pl」を以下のように改変する必要がありました。

functor_slash_arity(FsN) :-
	current_predicate(F/N),
	atom_concat(F,'/',Fs),
	number_chars(N,L),
	atom_chars(Na,L),
	atom_concat(Fs,Na,FsN).

write_all_fsa(S) :-
	functor_slash_arity(X),
	write(S,X),
	nl(S),
	fail.

つまり、アリティ(引数の数)として取得される値が、「数字」ではなく「数値」であり、そのままではアトム(文字列)として結合できないようなのです。
そのため、「数値」を「number_chars/2」で「数字のリスト」に変換し、それをさらに「atom_chars/2」でアトムに変換してから結合する、という処理を追加しています。
それから、ファイル名のパス区切り記号も、SWI-Prolog では「\\」とする必要がありますが、AZ-Prolog では「\」だけで良いという違いもありました。
ということで、

ensure_loaded('C:\Prolog\fsa.pl').

して

open('C:\Prolog\BuiltinPredAZ.txt',write,S),write_all_fsa(S),close(S).

した結果を、並べなおしたものが以下のファイルになります。

GNU Prolog

次に、GNU Prolog を確認します。
まずは「SWI-Prolog 方式」で試してみましたがエラー、ということで「AZ-Prolog 方式」に切り替えて成功したのですが、まったく述語情報を取得できていませんでした。
そこで GNU Prolog のサイトで確認してみますと、どうやら「set_prolog_flag/2」で「strict_iso」の値に「off」を設定しないと Built-in は対象にならないようです。
さらに言うと、GNU Prolog は、なぜか ISO 述語である「ensure_loaded/1」をサポートしておらず、「consult/1」を使う必要があります。
以上のことから、

set_prolog_flag(strict_iso,off).

consult('C:\\Prolog\\fsa.pl').

して

open('C:\\Prolog\\BuiltinPredGNU.txt',write,S),write_all_fsa(S),close(S).

しました。
以下がその結果を整理したものです。

YAP Prolog

最後は YAP Prolog です(「YAP」の「P」は「Prolog」の「P」のようなので、「YAP Prolog」という表記はどうなのかと思わなくもないですが)。
これも「SWI-Prolog 方式」はエラーで、「AZ-Prolog 方式」で成功したのですが、以下のわずかな述語しか取得できていませんでした。

commons_directory/1
exception/3
file_search_path/2
generate_message_hook/3
goal_expansion/2
goal_expansion/3
library_directory/1
message_hook/3
term_expansion/2

さすがにおかしいので調べてみたところ、YAP Prolog では組み込み述語は「system_predicate/2」か「predicate_property/2」で取得するようです。
後者である「predicate_property/2」が ISO 述語ということで、まずはこちらを試したのですが、頭に「$」の付くシステム内部用?の述語が大量に混じるため、前者の「system_predicate/2」を使うこととし、以下のようにしました。

functor_slash_arity(FsN) :-
	system_predicate(_,P),
	functor(P,F,N),
	atom_concat(F,'/',Fs),
	number_chars(N,L),
	atom_chars(Na,L),
	atom_concat(Fs,Na,FsN).

write_all_fsa(S) :-
	functor_slash_arity(X),
	write(S,X),
	nl(S),
	fail.

YAP Prolog もパス区切りは「\\」であるため、

ensure_loaded('C:\\Prolog\\fsa.pl').

して

open('C:\\Prolog\\BuiltinPredYAP.txt',write,S),write_all_fsa(S),close(S).

で、できたファイルを並べなおしました。

ISO 標準?

今回、「SWI-Prolog」「AZ-Prolog」「GNU Prolog」「YAP Prolog」と、四つの Prolog 処理系で確認しましたが、これらはいずれも、公式サイト上で「ISO 標準」に「準拠」あるいは「対応」または「互換」といったことが謳われています。
が、結果としては、どれ一つとして、「同じものが同じ手順で同じ結果になる」ということがありませんでした。
WikipediaProlog の項目には

結果として個々の処理系の互換性の乏しさは残り、それは Prolog の弱点として認識されている。

という一文がありますが(2015/03/29 現在)、これはなかなか手ごわい問題のように思います。

関連記事

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

スポンサーサイト

コメントの投稿

非公開コメント

最新記事
最新コメント
Amazonおまかせリンク
カテゴリ
タグクラウド
Amazonお買い得ウィジェット
カレンダー
05 | 2017/06 | 07
- - - - 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 -
月別アーカイブ
プロフィール

電脳太助

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アクセスランキング
最新トラックバック
アクセスランキング
[ジャンルランキング]
コンピュータ
106位
アクセスランキングを見る>>

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