1

私はプロローグの初心者であり、再帰的に考えるのが難しいと感じています。list1[0,0,0,1,1,0,1,1]、list2[1,0,1,0,0,0,1,1] という 2 つのリストがあるとします。また、list1 または list 2 の対応する位置に 1 がある場合、1 を持つリストを返したいと考えています。

merge([H1|[]],[H2|[]],[H3|[]]):- H2 = 1, H3 = 1, H1 is 1.
merge([H1|T1],[H2|T2],[H3|T3]):- merge(T1,T2,T3), H2 = 1, H3 = 1, H1 is 1.

上記のフォームでのたうち回ることができないことはわかっていますが、これは今のところプロローグのフォームに近いものです。再帰はとても難しいようです!

4

3 に答える 3

2

を使用してください!

@mat にハットチップ!実際には 2 回: コメント作成者に 1 回、実装者に 1 回。

:- use_module (ライブラリ(clpb) )。

bool_bool_or(A,B,AB) :- sat(AB =:= A + B)。

を使用したサンプル クエリmaplist/4:

?-マップリスト ( bool_bool_or、[1,1,1]、Bs、ABs)。
ABs = [1,1,1]、Bs = [_X、_Y、_Z]、sat(_X=:=_X)、sat(_Y=:=_Y)、sat(_Z=:=_Z)。

?- maplist(bool_bool_or, [1,1,1], _, ABs)。
AB = [1,1,1]。

?- maplist(bool_bool_or, [0,0,0,1,1,0,1,1], [1,0,1,0,0,0,1,1], AB)。
AB = [1,0,1,1,1,0,1,1]。
于 2015-11-13T13:07:09.163 に答える
1

で適切な演算式を使用するのはどうですか?

:- use_module(library(clpfd)).

z_z_max(A,B,AB) :-
   [A,B,AB] ins 0..1,
   AB #= max(A,B).

を使用したサンプル クエリmaplist/3:

?- maplist(z_z_max, [0,0,0,1,1,0,1,1], [1,0,1,0,0,0,1,1], Ls).
Ls = [1,0,1,1,1,0,1,1].           % succeeds deterministically

は、バックトラッキング検索を桁違いに高速化できるフロー最適化を制御するための高レベル インターフェイスを提供します。これを使って!

于 2015-10-30T17:04:39.583 に答える