我不知道如何描述这个案例。所以我不知道我可以搜索哪些关键字。我相信这不是一个难题。
我试图在Prolog中解决图形问题搜索。说我有以下预测:
bot(A,P,R):- ...
right(A,P,R):- ...
其中A是图形,p是当前点,R因此是底部/右侧点。如果没有这一点,他们就会失败。 (例如,我的右边没有任何意义,所以当我打电话时它会失败)
现在我想要一个列表,它有我的右边和右边的邻居。所以我想要的是这样的:
getRightAndBotNeighbour(A,P,Neighbours):-
( bot(A,P,BT) -> B = [BT] ; B = []),
( right(A,P,RT)-> R = [RT] ; R = []),
append(B,R,Neighbours).
上面的代码实际上有效..但这对我来说看起来很难看。我想知道是否有类似的...... 1行解决方案?
非常感谢。
答案 0 :(得分:2)
略微简化代码:
getRightAndBotNeighbour(A,P,Ns):-
( bot(A,P,BT) -> Ns = [BT|Ns1] ; Ns = Ns1 ),
( right(A,P,RT) -> Ns1 = [RT] ; Ns1 = [] ).
如果你有bot / 3和right / 3的变种将它们的结果直接放入一个列表中,它会看起来更整洁:
getRightAndBotNeighbour(A,P,Ns):-
bot(A, P, Ns, Ns1),
right(A, P, Ns1, []).
bot(A, P, Ns, Ns1) :- % right/4 analogous
( bot(A, B, T) -> Ns = [T|Ns1] ; Ns = Ns1 ).
最后,一个(完全不同的)单行解决方案将是
getRightAndBotNeighbour(A,P,Ns):-
findall(T, (bot(A,P,T) ; right(A,P,T)), Ns)