2012-05-22 4 views
3

Я новичок в Прологе, и у меня возникают проблемы, когда моя переменная, кажется, забылиПролог забывает/не доказывает мою переменную?

test(S) :- 
X = 'testing', 
(S = y, write(X)); 
(S = n, write(X)). 

Бег

test(y) 

печатает текст, как ожидалось, но

test(n) 

печатает

_L160 

Который я предполагаю, что переменная не является константой? Почему это происходит?

Я знаю, что он может выплюнуть ее в два предикат, как:

test(y) :- X = 'testing', write(X). 
test(n) :- X = 'testing', write(X). 

но моя фактическая проблема заключается в гораздо большем предикате, что не может быть упрощен, как это.

ответ

2

Дизъюнкция (;) в настоящее время успешно либо:

  1. Назначают 'тестирование' в X, у к S и писать Х. ИЛИ, если это не удается, трассировку и
  2. Присвоить п к S и писать Х

Добавьте несколько круглых скобок, чтобы они работали по назначению.

test(S):- 
X = 'testing', 
    (
     (S = y, write(X)) 
    ; 
     (S = n, write(X)) 
    ). 
3

Ваша проблема в приоритете ;/2. Если вы выдаете listing(test/1) вы получите это:

test(A) :- 
    ( B=testing, 
     A=y, 
     write(B) 
    ; A=n, 
     write(B) 
    ). 

, который показывает, как интерпретатор прочитать код.

Вы должны скобки свой код, чтобы получить то, что вы хотите:

test(S) :- 
    X = 'testing', 
    ((S = y, write(X)); 
    (S = n, write(X))). 
2

Позвольте мне вновь отступа для вас код:

test(S) :- 
     ( X = 'testing', S = y, write(X) 
     ; S = n, write(X) 
     ). 

Я надеюсь, что теперь ясно, что вы на самом деле написал.

Смежные вопросы