2016-02-01 2 views
1

Я хочу присвоить значение переменной R, но значение зависит от условия.Унифицировать переменную, если условие выполнено

if (cond1) 
    var = value1 + 5; 
else if (cond2) 
    var = value1 + 10; 
else 
    var = value2 + value3 + value4; 

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

[...], (cond1 -> Var is value1 + 5; 
     cond2 -> Var is value1 + 10; 
     Var is value2 + value3 + value4 
     ), [...] 
+2

Как выглядят conds? Приведите несколько примеров! Кстати. 'var' должен быть лучше' Var', то же самое для 'value'. – repeat

+2

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

+1

Я не уверен, что вы подразумеваете под * 'Var', присваивается значение, которое делает ограничение после сбоя *. Тип конструкции Prolog «if-then-else» выглядит так, что должен отражать ваш пример C-ish. Конечно, если 'Var' связан if-then-else, то он не может впоследствии отскочить к другому значению в рамках одного и того же предложения предиката. Вот как работает Prolog. – lurker

ответ

1

Это была ошибка с моей стороны : R уже был объединен до условий (в части [...]), что привело к чему-то вроде этого:

100 is 40 + 39 + 20 <--- FAIL

Изменение названия переменной позволило решить эту проблему.

+1

Правильно! Использование слишком немногих имен переменных и, как следствие, неожиданного поведения (faillure/exception) * может * быть showstopper. – repeat

1

В Прологе нет только назначений. Следующее может работать:

Вы унифицировать R со вторым аргументом правило foo

foo(Value, R) 

правило foo может быть построена следующим образом:

foo(Value, X) :- cond1, !, X is Value + 5. 
foo(Value, X) :- cond2, !, X is Value + 10. 
foo(Value, X) :- X is whatever. 
+0

Похоже, получится, если это сработает или нет – jonathanGB

+0

@Jonathan Это точно так же, как и код в вашем вопросе. Нет причин предпочесть это для вашей первоначальной попытки. Скорее всего, у вас есть какая-то опечатка или мысль-o в вашем фактическом коде (который вы не указали). –

+0

Да, это была ошибка, я уже объединил R до – jonathanGB

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