|
Location : Home > Languages > Perl > Package Title : Language::Prolog::Interpreter |
![]() |
Language::Prolog::Interpreter - Prolog のための簡易版インタプリタ
Language::Prolog::Interpreter->readFile('E:/src/PROLOG/flamenco.pr');
または
$a = <<'EOPROLOG';
parent(john,sally).
parent(john,joe).
parent(mary,joe).
parent(phil,beau).
parent(jane,john).
grandparent(X,Z) :-parent(X,Y),parent(Y,Z).
EOPROLOG
;
while ($a) {
eval 'Language::Prolog::Interpreter->readStatement(\$a)';
$@ && die $@,$a,"\n";
$a=~s/^\s*//;
}
# 上記と同じ
# 'Language::Prolog::Interpreter->readFile($pathtomyfile)'; と同等。
$a = '?- grandparent(GPARENT,GCHILD).';
print $a,"\n";
$Q = Language::Prolog::Interpreter->readStatement(\$a);
while($Q->query()) {
print "found solutions\n";
print 'GPARENT = ',$Q->variableResult('GPARENT'),"\n";
print 'GCHILD = ',$Q->variableResult('GCHILD'),"\n\n";
}
print "no more solutions\n\n";
$a = 'member(A,[A|_]).';
$b = 'member(A,[_|B]) :- member(A,B).'; #Classic member
Language::Prolog::Interpreter->readStatement(\$a);
Language::Prolog::Interpreter->readStatement(\$b);
$a = '?- member(c(V),[a(a),b(b),c(c),d(d),c(q)]).';
print $a,"\n";
$Q = Language::Prolog::Interpreter->readStatement(\$a);
while($Q->query()) {
print "found solutions\n";
print 'V = ',$Q->variableResult('V'),"\n\n";
}
print "no more solutions\n\n";
infix 演算子を認めない(ただし :- 及び , を除く。双方ともビルトインされている。)簡易版のインタプリタである。
以下の3つの構文が利用可能である。
1. Clauses
. で終わる節(clause)。これはデータベースに追加される。
2. Rules
. で終わる規則(rule)。これは格納される。
3. Queries
?- で始まり . で終わる、コンマで区切られた節のリスト。query を生成し、返す。
コメント
複数行にわたるコメントは Java と同じように /** ... **/ で囲む。
単一行のコメントは % で始まるものとする。
空白
シングルクォート内のアトム(atom)以外は空白は無視される。
利用可能な項は以下のようなものである。
Lists1:
[]で囲まれたコンマで区切られた項のリスト。例えば
[Term1,Term2]
Lists2:
List1 と同様だが、最後の項は | で区切られている。例えば
[Term1,Term2|Variable]
Atoms1:
小文字から始まる文字/記号/アンダースコアの列。(すなわち \w キャラクタクラス) 例えば
this_Is_An_Atom
Atoms1:
シングルクォート(')で囲まれた文字列。例えば
'This is another atom!'
Variables:
小文字から始まる文字/記号/アンダースコアの列。(すなわち \w キャラクタクラス)の列。
This_is_a_var, _and_this, _90
Clauses:
左括弧 "(" 及びコンマで区切られた項のリストがそのあとに続き右括弧 ")" で終わるAtom1。例えば
clause(one), clause2(a,hello,'More !',[a,b,c])
Rules:
(場合より空白) :- (場合より空白)コンマで区切られた節の列からなる節。
Jack Shirazi
Shirzai氏は既に活動を停止しているようなので、Lee Goddard <lgoddard@cpan.org> が単数及び複数行のコメント・複数行の節のパースなどをサポートした。
Copyright (C) 1995, Jack Shirazi. All Rights Reserved.
Updates Copyright (C) 2001, Lee Goddard. All Rights Reserved.
Perl 本体と同等の条件で利用可能である。
![]() |
Updated : 2006/10/05 |