0

試験でこの Prolog の質問がありましたが、正しく理解できなかったと確信しています。

triple(List1,List2) を定義する必要がありました。たとえば、triple([1,2,3],[3,6,9]) と triple([2,4],[6,12]) は true です。

私の試みはこれでしたが、うまくいかないと思います...

triple([],[]).
triple([H1|T1],[H2|T2]) :-
    triple(T1,T2),
    H1 = H2 * 3.

誰もが正しい解決策を知っていますか? (注、これは宿題ではなく、試験問題に興味があるだけです。)

4

2 に答える 2

0

整数リストに制限できる場合は、ライブラリ ( clpfd )を使用できます。

?- [library(clpfd)].
?- [user].
|: triple(X, Y) :- maplist(tri, X, Y).
|: tri(X, Y) :- X * 3 #= Y.
|: % user://1 compiled 0,13 sec, 5 clauses
true.

?- triple([2,X,Y],[Z,9,12]).
X = 3,
Y = 4,
Z = 6.

浮動小数点式を処理するには、ライブラリ ( clpr )があります。

?- [library(clpr)].
?- [user].
|: triplef(X, Y) :- maplist(mult(3), X, Y).
|: mult(F,X,Y) :- {X * F = Y}.
|: % user://3 compiled 0,27 sec, 79 clauses
true.

?- triplef([2,X,Y],[Z,9,12]).
X = 3.0,
Y = 4.0,
Z = 6.0 .

再利用可能なmult/3を使って、triplef/3 を triple/3 よりも少し良いコードにしました。

于 2013-04-23T07:03:52.540 に答える