作成された中間表現があると思いますが、それらを発掘する方法がわかりません。たとえそうしたとしても、私の最初のアドバイスは、あなたが望むより単純なルールを書くことだと思います.
最初の例は次のように書き直すことができると確信しています。
例 1 前
tuple1(x),
tuple2(x),
function1[y, z] = x
<-
in_tuple1(x),
in_tuple2(x, y),
in_tuple3[x, y] = z.
例 1 後
tuple1(x) <- in_tuple1(x), in_tuple2(x, y), in_tuple3[x, y] = _.
tuple2(x) <- in_tuple1(x), in_tuple2(x, y), in_tuple3[x, y] = _.
/** alternatively
tuple1(x) <- function1[_, _] = x.
tuple2(x) <- function1[_, _] = x.
**/
function1[y, z] = x
<-
in_tuple1(x),
in_tuple2(x, y),
in_tuple3[x, y] = z.
2つ目は少し自信がありません。2 つのルールの間に矛盾はありません。ここに問題がある場合、関数の依存関係の違反が発生する可能性があります。これは、「エラー: 関数に競合するレコードを含めることはできません」の出力またはログによってわかります。
例 2 前 (最後に「.」を含む完全な句を想定)
tuple1(x,y)
<-
(
in_tuple1(x,z),
in_tuple2(y,z)
)
;
in_tuple2(x,y).
例 2 後
tuple1(x,y)
<-
in_tuple1(x,z),
in_tuple2(y,z).
tuple1(x,y)
<-
in_tuple2(x,y).