我有谓词
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个结果。为什么呢?
答案 0 :(得分:2)
基本上,您只有一个(->)/2
If -> Then
。 If
就在你的情况下
( element(_,B), member(A,B) )
得到第一个答案并承诺,因此不会考虑其他答案。 Then
是forall/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的纯粹,单调的子集。