所以我正在研究练习题,我需要找到右,上,下和左开的单元格数。我有一个有效的解决方案,但我想将其改为条款。我不想使用 - >定义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).
答案 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.