2016-11-22 1 views
0

私は練習問題に取り組んでいます。ここでは、右、上、下、左に開くセルの数を見つける必要があります。私は実用的な解決策を持っていますが、私はそれを節に変えたいと思います。私はifとelseを定義するために - >を使いたくありません。ソリューションに影響を与えることなく、以下のコードをどのように修正できますか?あなたのcontains1/2述語がちょうど標準member/2あるプロローグ内の句への変換方法

stats(U,D,L,R) :- maze(Size,_,_,_,_), 
      findall(R, genXY(Size,R), Out), 

      statsHelp(Out,U, L, R, D). 

statsHelp([],0,0,0,0). 
statsHelp([[X|[Y]]|Tl],U, L, R, D) :- cell(X,Y,Dirs,Wt), 
          (contains1(u,Dirs) -> U1 is 1; U1 is 0), % how do i remove -> and separate them into clauses? 
          (contains1(d,Dirs) -> D1 is 1; D1 is 0), 
          (contains1(l,Dirs) -> L1 is 1; L1 is 0), 
          (contains1(r,Dirs) -> R1 is 1; R1 is 0), 
          statsHelp(Tl,U2, L2, R2, D2), 

          U is U1 + U2, 
          D is D1 + D2, 
          R is R1 + R2, 
          L is L1 + L2. 




contains1(V,[V|Tl]). 
contains1(V,[Hd|Tl]):- 
contains1(V,Tl). 
+1

[回答](http://stackoverflow.com/a/40035182/1812457)を参照してください。質問は重複していませんでしたが、その答えがあなたにとって有用であるかもしれません。 –

答えて

0

注意、あなたの代わりに使用できます。ここでは

はコードです。

常に成功し、余分な0または1を生成するバージョンについては、それを達成するためにカットまたは否定を使用する必要があると思います。ここで否定を有するものである:

member_reified(X, Xs, Result) :- 
    member(X, Xs), 
    Result = 1. 
member_reified(X, Xs, Result) :- 
    \+ member(X, Xs), 
    Result = 0. 

あなたはもちろん、単にmember_reified/3のあなたの定義に->の使用を移動することができます。実装によって、バックトラッキングのトレードオフが異なる場合があります。これは数回成功するかもしれません:

?- member_reified(x, [a, b, c], Result). 
Result = 0. 

?- member_reified(a, [a, b, c], Result). 
Result = 1 ; 
false. 

?- member_reified(a, [a, b, c, a], Result). 
Result = 1 ; 
Result = 1 ; 
false.