非快捷方式还是在prolog中?
我不知道该如何描述这个案子。。所以我不知道我可以搜索哪些关键字。我相信这不是一个困难的问题 我试图在Prolog中解决一个图形搜索问题。假设我有以下预测:非快捷方式还是在prolog中?,prolog,Prolog,我不知道该如何描述这个案子。。所以我不知道我可以搜索哪些关键字。我相信这不是一个困难的问题 我试图在Prolog中解决一个图形搜索问题。假设我有以下预测: bot(A,P,R):- ... right(A,P,R):- ... 其中A为图形,p为当前点,R为相应的右下角点。如果没有这一点,他们就会失败。(例如,我的右边没有点,所以当我打右边时它会失败) 现在我想有一份名单,上面有我最底层和最右边的邻居。所以我想要的是这样的: getRightAndBotNeighbour(A,P,Neighb
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).
上面的代码实际上是有效的。。但在我看来这很难看。我想知道是否有这样的事情。。单线解决方案
非常感谢。稍微简化一下您的代码:
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)
Thx,换成bot/4看起来更整洁,而且我以前从来没想过用
findall
的方式;看起来很整洁:)