如何转换 - > prolog中的条款

时间:2016-11-22 03:55:52

标签: prolog

所以我正在研究练习题,我需要找到右,上,下和左开的单元格数。我有一个有效的解决方案,但我想将其改为条款。我不想使用 - >定义if和else。如何在不影响解决方案的情况下修复下面的代码。

以下是代码:

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 个答案:

答案 0 :(得分:0)

请注意,您的contains1/2谓词只是标准member/2,您可以使用它。

对于总是成功并产生额外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.