2016-03-02 24 views
0

我是prolog中的新手,所以我已经完成了一个程序,它有一个方法来查询某些东西,但是当我使用它时,即使它应该结束,它也会保持良好的结果。如何使条件在prolog中结束查询?

amigos(juanarjona,omarpacheco). 
amigos(juanarjona,jasonancona). 
amigos(juanarjona,jorgebolio). 
amigos(juanarjona,gerardoadrian). 

amigos(Amigo,Amigoslista):-!,amigos(Amigoslista,Amigo). 

例如,当我执行

amigos(X,juanarjona). 

它应该给我眼前这个答案:

X = omarpacheco; X = jasonancona; X = jorgebolio; X = gerardoadrian ;

,但它确实是重复这些问题的答案没有结束这样

X = omarpacheco; X = jasonancona; X = jorgebolio; X = gerardoadrian ; X = omarpacheco; X = jasonancona; X = jorgebolio; X = gerardoadrian。 。 。 。 。 。 。 。 。 。 。 。 (重复)...........

所以,这就是为什么我反复向你们,我需要知道如何建立一个条件,不让重复的答案。 对不起,我的英语不好。

我忘了说,它必须是只有一个谓语在这种情况下,“吾友”

+0

请更具体!对于您可能使用或可能不使用的其他限制呢? – repeat

回答

2

这很容易:使用谓词,而不是一个!

第一谓词仅包括事实:

 
amigos(juanarjona, omarpacheco). 
amigos(juanarjona, jasonancona). 
amigos(juanarjona, jorgebolio). 
amigos(juanarjona, gerardoadrian). 

建立在第一个—顶部的第二一个—提供了对称的闭合:使用SICStus的Prolog

 
sym_amigos(X, Y) :- amigos(X, Y). 
sym_amigos(X, Y) :- amigos(Y, X). 

示例查询4.3.2:

 
| ?- sym_amigos(P, Q). 
P = juanarjona, Q = omarpacheco ? ; 
P = juanarjona, Q = jasonancona ? ; 
P = juanarjona, Q = jorgebolio ? ; 
P = juanarjona, Q = gerardoadrian ? ; 
P = omarpacheco, Q = juanarjona ? ; 
P = jasonancona, Q = juanarjona ? ; 
P = jorgebolio, Q = juanarjona ? ; 
P = gerardoadrian, Q = juanarjona ? ; 
no 

当你的事实依据变得越来越大,看着所有的具体答案被讨厌......所以,检查是否sym_amigos/2终止普遍,我们可以运行这样一个查询:

 
| ?- sym_amigos(P, Q),  % looking for amigos ... 
    false.     % ... we discard every candidate solution. 
no       % "no" means "terminates universally" 

以上查询可以永不屈服任何解决方案—毕竟,它与目标false/0连词:

  • 可以,然而,告诉我们,如果上述目标终止普遍。
  • 如果序言返回no —它 —我们知道sym_amigos/2终止普遍。

脚注1: symm/2覆盖共用成语 “symmetric closure”。
脚注2: SWI-Prolog不回复no,而是改为false