Я использую SWI для Windows и пробую выполнить упражнение в Learn Prolog Now!
travel(Start,Dest,X) :-
(byCar(Start,Dest); byTrain(Start,Dest); byPlane(Start,Dest)),
X = go(Start,Dest).
В этом коде, если вы можете получить доступ к Dest из Start, Prolog говорит:
правда.
X = go (Start, Dest)..
и просто говорит ложь иначе.
Однако в этом коде, когда я удалил круглые скобки, он говорит только «истина», если она действительна, и «ложь», если она недействительна. Ответ правильный, но почему он не выводит X?
travel(Start,Dest,X) :-
byCar(Start,Dest); byTrain(Start,Dest); byPlane(Start,Dest),
X = go(Start,Dest).
Это из-за приоритета оператора, в котором сначала вычисляется AND? Даже если это так, разве X не должен быть равным (Start, Dest)?
Меня смущает то, как Prolog присваивает значения переменным.
ты прав, приоритетность и ниже того или. Если вы не уверены, вы можете использовать write_canonical.
и current_op для предварительной проверки
@WillNess: Пролог использует
precedence
для обозначения первого аргумента op / 3. И порядок такой, как показано … — person thedoublejointedprince; 21.11.2013ваш первый код эквивалентен
если какой-либо из предикатов
byNNN
выполнен успешно, любые привязки, которые они создали для своих аргументов, будут отражены привязкойX
. Если вы видитеX = go(Start,Dest)
в качестве вывода, это означает, чтоbyNNN
удалось выполнить без создания экземпляров его аргументов.второй эквивалентен
поэтому, когда он преуспевает с помощью своего первого или второго предложения, он вообще не включает
X
.