prolog中的非快捷方式?

时间:2014-04-01 18:43:02

标签: prolog

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

我试图在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行解决方案?

非常感谢。

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)