2

私は、より読みやすく、宣言的なプログラムを書くよう努めています。そこで、現在使用している単純なアルゴリズムを実装することにしました。手続き型の実装は次のとおりです。

  1. コマンドとリソースがあります
  2. 各コマンドは、複数のリソースを提供および要求できます
  3. アルゴリズムはすべてのコマンドをループし、すべての要件が提供されているコマンドをスケジュールします。
  4. コマンドが提供するすべてのリソースが提供されるようになりました
  5. すべてのコマンドがスケジュールされていれば完了です
  6. コマンドが残っている場合、依存関係を満たすことができず、アルゴリズムの反復のために新しいコマンドをスケジュールできません。

したがって、私が思いついたデータログの亜種は見栄えが良いですが、2 つの問題があります。

  1. 違います
  2. 結果を読み取るにはループが必要です

完全なソースはここにあります

それは仮説に依存し、pytest で簡単に実行できます。

失敗したテストの下: 以前の「ランク」または順序によって提供されたリソースが必要な場合。見つからない。フォローを再帰的にしようとしましたが、単純な例でも失敗します。

def test_graph_multirequire():
    """Test if the resolver can handle a graph with multiple requires"""
    tree = [
        [('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ()],
        [(), ('A'), ('B'), ('C', 'A'), ('D'), ('E'), ('F'), ('G')]
    ]
    run_graph(tree)


def run_graph(tree):
    """Run an example"""
    try:
        tree_len = len(tree[0])
        index = list(range(tree_len))
        random.shuffle(index)
        for i in index:
            + is_command(i)
            for provide in tree[0][i]:
                + provides(i, provide)
            for require in tree[1][i]:
                + requires(i, require)
        ##############################
        is_root(X) <= is_command(X) & ~requires(X, Y)
        follows(X, Z) <= (
            provides(X, Y) & requires(Z, Y) & (X != Z)
        )
        order(0, X) <= is_root(X)
        order(N, X) <= (N > 0) & order(N - 1, Y) & follows(Y, X)
        ##############################
        ordered = []
        try:
            for x in range(tree_len):
                nodes = order(x, N)
                if not nodes:
                    break
                ordered.extend([x[0] for x in nodes])
        except AttributeError:
            ordered = index
        assert len(ordered) >= tree_len
        print(ordered)
        provided = set()
        for command in ordered:
            assert set(tree[1][command]).issubset(provided)
            provided.update(tree[0][command])
    finally:
        pd.clear()

私の質問:

  1. 間違ったツールを使用していますか?
  2. 包括的なデータログのハウツーを知っている人はいますか?
  3. 上記の問題を実際にどのように解決しますか?

編集:

  1. all() や exists() などの量指定子がありません。これを pyDatalog で表現するにはどうすればよいですか?
4

1 に答える 1