非快捷方式还是在prolog中?

非快捷方式还是在prolog中?,prolog,Prolog,我不知道该如何描述这个案子。。所以我不知道我可以搜索哪些关键字。我相信这不是一个困难的问题 我试图在Prolog中解决一个图形搜索问题。假设我有以下预测: bot(A,P,R):- ... right(A,P,R):- ... 其中A为图形,p为当前点,R为相应的右下角点。如果没有这一点,他们就会失败。(例如,我的右边没有点,所以当我打右边时它会失败) 现在我想有一份名单,上面有我最底层和最右边的邻居。所以我想要的是这样的: getRightAndBotNeighbour(A,P,Neighb

我不知道该如何描述这个案子。。所以我不知道我可以搜索哪些关键字。我相信这不是一个困难的问题

我试图在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).
上面的代码实际上是有效的。。但在我看来这很难看。我想知道是否有这样的事情。。单线解决方案


非常感谢。

稍微简化一下您的代码:

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
的方式;看起来很整洁:)