2014-10-28 1 views
2

내가SWI - 프롤로그 기능 FORALL은

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(..) copypaste, 그것은 나에게 모두 2 결과를 제공합니다. 왜?

+0

어떻게 forall/2? – false

+0

forall ((요소 (_, B), 멤버 ('Rogue', B)), (요소 (C, B), 수퍼 클래스 (D, C) – defusioner

답변

2

기본적으로 (->)/2If -> Then입니다. If 따라서 다른 답변은 고려되지 않습니다, 귀하의 경우

(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의 순조롭고 단조로운 하위 세트에 먼저 충실하게하는 것이 좋습니다.

+0

실제로 나는 1 -> (다른 가능한 변종들과 함께)를 갖고 있으며, 이것으로 막 게시되었습니다. 나는 그것이 OK 인 콘솔을 위해서 forall을 복사하지만 술어는 아니다 .. – defusioner

+0

실례합니다. – defusioner