
{
module(nlmem).

R=nlmem.copy(M) :- R=nlmem.copy(M, copied).

/**
 * nlmem.copy(+Mem, +CopyTagAtom, -Res):
 *
 * 与えられた膜を複製する．複製された膜のMem以外の自由リンクは
 * それぞれ、指定されたunaryアトムと同名の三引数アトムの複製に接続される．
 * @param +Mem 複製する膜
 * @param +CopyTagAtom 複製された膜の自由リンクに接続される三引数アトムと同名のunaryアトム
 * @param -Res 結果( 成功時 copied(Mem, Mem_copied, Res) 失敗時 copy_error(Mem, Res) )
 * @example
 * R=nlmem.copy(M, cpd), {$p[M|*Z]}
 * ==>
 * R=copied(M,M'), {$p[M|*Z]}, {$p[M'|*Z']}, cpd(*Z')
 */
nlmem.copy(M,B,C) :- unary(B) |
    '$callback'('nlmem_copy', M, B, C).

nlmem.kill({$p,@p}), :- nlmem.kill({$p,@p}, killed).

/**
 * nlmem.kill(+Mem, +KillTagAtom)
 *
 * 与えられた膜を破棄する．その膜のMem以外の自由リンクにはそれぞれ、
 * 指定されたunaryアトムの複製が接続される．
 * ( Memが子膜へのリンクでない場合，Memにkill_error/1が接続される．)
 * @param +Mem 破棄する膜
 * @param +KillTagAtom 破棄された膜の自由リンクに接続されるunaryアトム
 * @example nlmem.kill(M, kld),{$p[M|*Z]} ==> kld(*Z)
 */
nlmem.kill(M, T) :- unary(T) | '$callback'('nlmem_kill', M, T).

}.

