2014-10-28 4 views
2

У меня есть предикатSWI-Prolog 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').. В конце концов, предикат печатает только 1 из них. Однако, когда i copypaste forall(..) для консоли, он дает мне все 2 результата. Зачем?

+0

Как вы копируете 'forall/2?' – false

+0

forall ((element (_, B), member ('Rogue', B)), (элемент (C, B), суперкласс (D, C), формат ('~ w -> ~ w -> ~ w \ n', [D, C, 'Rogue'])). – defusioner

ответ

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.

+0

На самом деле у меня есть более 1 -> (с другими возможными вариантами), только что опубликованный с этим. Я копирую forall для консоли, это нормально, но не из предиката .. – defusioner

+0

извините. – defusioner