swi-prolog forall功能不起作用

时间:2014-10-28 17:11:41

标签: prolog prolog-toplevel

我有谓词

superclass('Horde', 'Blood Elf').
superclass('Horde', 'Orc').

element('Blood Elf', ['Paladin', 'Priest','Mage','Warlock','Death Knight','Rogue']).
element('Orc', ['Warrior', 'Shaman','Warlock','Death Knight','Hunter','Rogue']).

find(A):-
  (  element(_,B),member(A,B)
  -> forall(
        ( element(_,B), member(A,B) ),
        ( element(C,B), superclass(D,C), format('~w -> ~w -> ~w\n',[D,C,A])))
  ;  superclass(A, _)
  -> format('~w\n',A), forall(superclass(A,B),format('\t~w\n',B))
  ).  

find('Rogue').的两个结果。毕竟,谓词只打印其中一个。但是,当我复制forall(..)到控制台时,它给了我所有2个结果。为什么呢?

1 个答案:

答案 0 :(得分:2)

基本上,您只有一个(->)/2 If -> ThenIf就在你的情况下

( element(_,B), member(A,B) )

得到第一个答案并承诺,因此不会考虑其他答案。 Thenforall/2,可以成功一次,也可以失败。所以,永远不应该出现一个以上的答案。


因此,您要将原始程序与查询进行比较:

?- forall(
      (  element(_,B), member('Rogue',B) ),
      (  element(C,B),
         superclass(D,C),
         format('~w -> ~w -> ~w\n',[D,C,'Rogue'])
      )).

但原来的节目不同!它基本上是:

?- element(_,B),member(A,B)
    -> forall(
          (  element(_,B), member(A,B) ),
          (  element(C,B),
             superclass(D,C),
             format('~w -> ~w -> ~w\n',[D,C,A]))).

因此,原始计划A B已修复,而在您的查询中,只有A已修复。

请注意,通过写出来以这种方式进行编程通常会导致与Prolog本身无关的各种错误。我宁愿建议你首先坚持Prolog的纯粹,单调的子集。