次の事実とルール (簡略化) を使用して、ギリシャ神話のミューズの祖先を見つけようとしています。
/* parent(A, B) - A is the parent of B */
parent(zeus, calliope).
parent(zeus, clio).
parent(zeus, melpomene).
parent(zeus, euterpe).
parent(zeus, erato).
parent(zeus, terpsichore).
parent(zeus, urania).
parent(zeus, thalia).
parent(zeus, polymnia).
parent(mnemosyne, calliope).
parent(mnemosyne, clio).
parent(mnemosyne, melpomene).
parent(mnemosyne, euterpe).
parent(mnemosyne, erato).
parent(mnemosyne, terpsichore).
parent(mnemosyne, urania).
parent(mnemosyne, thalia).
parent(mnemosyne, polymnia).
parent(kronos, zeus).
parent(rheia, zeus).
parent(oranos, kronos).
parent(gaia, oranos).
および祖先ルールは次のmuse
ように定義されます。
/* A is a Muse if A's parents are Zeus and Mnemosyne */
muse(A):- parent(zeus, A), parent(mnemosyne, A).
/* A is the ancestor of B if A is the parent of B */
ancestor(A, B):- parent(A, B).
/* A is an ancestor of C if A is the parent of B and B is the ancestor of C */
ancestor(A, C):- parent(A, B), ancestor(B, C).
私は基本的に次のことをしたい:
/* Get the set of ancestors A of muses B and store in Z*/
setof(A, ancestor(A, muse(B)), Z).
これは機能せず、 を返しますfalse
。私が試した別のバリアント:
findall(B, muse(B), Muses),
setof(A, ancestor(A, Muses), Z).
しかし、より多くのparent
事実があることを考えると、考えられるすべてのancestor
バッグを反復するだけです。
私が試した最後のバリアント:
setof(A, ancestor(A, member(X, muse(X)), Z).
しかし、それは次のようにエラーになります:
ERROR: Syntax error: Operator expected
ERROR: setof(A, ancestor(A, member(X, muse(X)), Z)
ERROR: ** here **
ERROR: .
これは理にかなっています。
次のような結果を書き込めるようにしたい:
write('The Muses ancestors are: '), write(MuseAncestors), nl.
私は何を間違っていますか?