Вырезать в начале предложения

Рассмотрим предикат Prolog p(integer),q(integer),r(integer) с потоковой моделью (o) и предикатом s:

p(1). q(1). r(1).
p(2). q(2). r(2).
s:-!,p(X),q(Y),r(Z),write(X,Y,Z),nl.

Дайте результат следующей цели: s. Обоснуйте ответ.

Результат: 111,112,121,122,211,212,221,222. Я видел, что сокращение не действует, если оно стоит в начале предложения. Это правда?


person hackermanwasd    schedule 09.01.2021    source источник


Ответы (2)


сокращение не имеет эффекта, если оно находится в начале предложения.

Не совсем. Это будет зависеть от того, есть ли у такого предиката другие предложения или нет.

Кроме того:

  • предикат write унарный и не может быть вызван с тремя аргументами.
  • лучше сгруппировать предложения в определении каждого предиката.

Правильная программа будет:

p(1). p(2).
q(1). q(2).
r(1). r(2).

s :- !, p(X), q(Y), r(Z), writeln(X-Y-Z).

Действительно, для этой программы cut не действует. Однако рассмотрите следующую новую версию программы.

p(1). p(2).
q(1). q(2).
r(1). r(2).

s :- !, p(X), q(Y), r(Z), writeln(X-Y-Z).
s :- writeln(here).                       % <= this clause will not be executed!

В этом случае cut в первом предложении предиката s предотвратит выполнение второго.

person slago    schedule 09.01.2021

сокращение не имеет эффекта, если оно находится в начале предложения

Это неправда (ну, это здесь, но случайно).

Вырезание означает, что не нужно возвращаться влево, а не выполнить предикат.

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

Вы также можете прочитать его как разделитель защитного действия, выполняющий логику первого охранного выигрыша, где соответствующее охраняемое действие (и только это) запускается при успешном защитном действии:

head1 :- guard1,!,action1.
head2 :- guard2,!,action2.
head3 :- guard3,!,action3.
head4 :- else_action.

Для s/0 перед ! фактически есть пустое средство защиты, поэтому тестирование защиты не выполняется, а выполняется только выполнение текущего предложения. Но для s/0 есть только одно предложение, поэтому фиксация ничего не делает.

person David Tonhofer    schedule 09.01.2021