Не понимаю, как Prolog присваивает значения. Почему Prolog не связывает X, если нет скобок?

Я использую 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 присваивает значения переменным.

См. также:  Как проверить, содержит ли переменная прямоугольник в Pygame?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. thedoublejointedprince

    ты прав, приоритетность и ниже того или. Если вы не уверены, вы можете использовать write_canonical.

    4 ?- write_canonical((travel(Start,Dest,X) :-
        byCar(Start,Dest); byTrain(Start,Dest); byPlane(Start,Dest),
        X = go(Start,Dest))).
    :-(travel(A,B,C),;(byCar(A,B),;(byTrain(A,B),','(byPlane(A,B),=(C,go(A,B))))))
    true.
    
    5 ?- write_canonical((travel(Start,Dest,X) :-
        (byCar(Start,Dest); byTrain(Start,Dest); byPlane(Start,Dest)),
        X = go(Start,Dest))).
    :-(travel(A,B,C),','(;(byCar(A,B),;(byTrain(A,B),byPlane(A,B))),=(C,go(A,B))))
    true.
    

    и current_op для предварительной проверки

    6 ?- current_op(P,A,(,)).
    P = 1000,
    A = xfy.
    
    7 ?- current_op(P,A,(;)).
    P = 1100,
    A = xfy.
    

    @WillNess: Пролог использует precedence для обозначения первого аргумента op / 3. И порядок такой, как показано … person thedoublejointedprince; 21.11.2013

  2. thedoublejointedprince

    ваш первый код эквивалентен

    travel(Start,Dest,X) :- byCar(Start,Dest), X = go(Start,Dest).
    travel(Start,Dest,X) :- byTrain(Start,Dest), X = go(Start,Dest).
    travel(Start,Dest,X) :- byPlane(Start,Dest), X = go(Start,Dest).
    

    если какой-либо из предикатов byNNN выполнен успешно, любые привязки, которые они создали для своих аргументов, будут отражены привязкой X. Если вы видите X = go(Start,Dest) в качестве вывода, это означает, что byNNN удалось выполнить без создания экземпляров его аргументов.

    второй эквивалентен

    travel(Start,Dest,X) :- byCar(Start,Dest).
    travel(Start,Dest,X) :- byTrain(Start,Dest).
    travel(Start,Dest,X) :- byPlane(Start,Dest), X = go(Start,Dest).
    

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

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: