0

しばらくの間、次の問題を解決しようとしてきましたが、正しい解決策が見つからないようです。

X が数値の 1 つのペア、Y がペアのリスト、Z が推移的なペアの結果のリストである関数 test(X,Y,Z) があるとします。

例えば:

test((1,5), [(7,3),(5,2),(5,9)], Z).

Z = [(1,2),(1,9)]

(推移性のため 1->5->2 および 1->5->9)

これまでのところ、次のコードを作成できました。

test(_,[],_):- false.
test((X1,C),[(C,Y2)|_],(X1,Y2)).
test((X1,X2),[_|YT],Result) :- test((X1,X2),YT,Result).

次のように、個々の結果ペアを返します。

Z = (1, 2) ;
Z = (1, 9) ;

しかし、上記の例のように、それらすべてを 1 つのリストに返すことはできないようです。

Z = [(1,2),(1,9)]

どんな助けでも大歓迎です。

4

1 に答える 1

2

問題は、推移的なペアのリストを作成していないことだと思います。の 3 番目の引数として 1 つのペアを返すだけですtest/3

考えられる解決策の 1 つを次に示します。

ペアの比較とそれらの推移的な結婚の説明を処理する述語を作成したので、後続のルールでこれらのタプルをジャグリングする必要がなくなりました。

transit((X,T), (T,Y), (X,Y)).

次に、再帰述語を使用した標準的なリスト処理の問題です。

t(_, [], []).
t(X, [T|ToTransit], [Y|Transited]) :-
    transit(X,T,Y),
    t(X,ToTransit,Transited).
t(X, [T|ToTransit], Transited) :-
    \+ transit(X,T,_),
    t(X,ToTransit, Transited).

もちろん、transit/3関係を定義するような述語があれば、次のようなこともできます。

findall( TP,
         ( member(T, [(2,2), (2,5), (1,5)]), transit((1,2), T, TP) ),
         Tps). 
于 2013-10-28T21:16:29.890 に答える