[Next]暗黙的変換 [Previous]準備 [Up]PoPの使用方法 [Top]

定義

PoPが扱うプログラム,データは,PoP用に定義されたオブジェクトです. 以下,これらをPoPオブジェクトと呼びます(PoPインスタンスと混同しないよう注意してください).
PoP内では,PoPオブジェクトで処理されています.

PoPオブジェクトを生成するためにはどうしたらよいか,を説明します.

整数
整数は,PoPの中ではIntegerクラスのインスタンスとして扱われます. 渡したい値valueに対して
Integer(value)
とインスタンス生成します. valueに浮動小数点数が指定されたときは,整数化されます.

浮動小数点数
浮動小数点数は,PoPの中ではFloatクラスのインスタンスとして扱われます. 渡したい値valueに対して
Float(value)
とインスタンス生成します. valueに整数が指定されたときは,浮動小数点数化されます.

文字列
文字列は,PoPの中ではStringクラスのインスタンスとして扱われます. 渡したい値valueに対して
String(value)
とインスタンス生成します.

アトム
単純アトムは,名前を示す文字列nameを指定して
Atom(name)
とインスタンス生成します.
複合アトムは,名前の他に引数を順次指定して
Atom(name, x1, x2, .. , xn)
または,キーワードargsにシーケンスを指定して
Atom(name, args=(x1, x2, .. , xn))
Atom(name, args=[x1, x2, .. , xn])
としてインスタンス生成します.
引数を並べる方法とarg=で指定する方法を併せてもかまいません.
Atom(name, x1, .. , xi, args=(xj, .. , xn))
複合アトムを定義するのに,便利な方法があります. 例えば
a = Atom('a')
としておいて
a(x1, x2, .. , xn)
とすると,
Atom('a', x1, x2, .. , xn)
と同じになります.

NIL
NILを表わすオブジェクトは,PoPモジュールをimportした時点でNILという名前で生成されています. これを使ってください.

リスト
リストは,
List(x1, x2, .. , xn)
とインスタンス生成します.Atomと同じように
List(items=(x1, x2, .. , xn))
List(items=[x1, x2, .. , xn])
ともできます(キーワードはargsではなく,itemsです).
尾部を指定するためには,tailというキーワードを使用します.
List(x1, .. , xm, tail=xn)
List(items=(x1, .. , xm), tail=xn)
尾部に指定できるのは,NIL,リスト,変数のいずれかです.

節は,
Clause(h, b1, b2, .. , bn)
とインスタンス生成します. あるいは,
Clause(h, body=(b1, b2, .. , bn))
Clause(h, body=[b1, b2, .. , bn])
ともできます.
節には,事実,規則,質問がありますが,それぞれ次のように定義します.
事実 P0.
  => Clause(P0)
規則 P0 :- P1, P2, .. , Pn.
  => Clause(P0, P1, P2, .. , Pn)
質問 ?- P1, P2, .. , Pn.
  => Clause(None, P1, P2, .. , Pn)

変数
変数は,名前を示す文字列nameを指定して
Variable(name)
とインスタンス生成します. 変数名のスコープは(最上位の)節です.
なお,名前を指定せず
Variable()
と生成された変数は無名変数といい,何とでも単一化されます.

注意点

アトムや変数は,オブジェクトではなく名前で区別されますので,例えば
a = Atom('a')
X = Variable('X')
a(X, X)
Atom('a', Variable('X'), Variable('X'))
は同値です.

[Next]暗黙的変換 [Previous]準備 [Up]PoPの使用方法 [Top]