Описание тега prolog-cut

Cut, spelled as an exclamation mark "!", is a special goal that serves as a control construct in the Prolog programming language.
3 ответа

Реализация "cut" в парсере рекурсивного спуска

Я внедряю генератор синтаксического анализатора PEG в Python, и до сих пор добился успеха, за исключением функции "вырезать", о которой знает тот, кто знает Пролог. Идея в том, что после разреза (!) символ был проанализирован, поэтому никакие альтер…
03 янв '13 в 18:15
1 ответ

Обрезание начала предложения и связь между "cut", `!` И `fail`

Что значит поставить разрез (!в самом начале статьи? p(X,Y) :- !, q(X), r(X,Y). В чем разница между ! а также fail и как они связаны? Благодарю.Я думаю, что для fail, предикат просто "провалится" LOL, который отличается от не возврата? просто хочу б…
24 фев '15 в 04:39
2 ответа

Как предотвратить не в прологе?

Пролог, рекурсивная функция: я хочу, чтобы он печатал C с каждым элементом списка, например: C=30 и [H|T]= [-9,-10,-30] myfunc(C,[H|T]):- (\+([H|T]=[])), write(C), write(' with '), write(H), nl, myfunc(C,T). в начале я проверяю, что заголовок списка…
30 ноя '12 в 19:38
3 ответа

Разбор в прологе без среза?

Я нашел этот хороший фрагмент для разбора LISP в Прологе ( отсюда): ws --> [W], { code_type(W, space) }, ws. ws --> []. parse(String, Expr) :- phrase(expressions(Expr), String). expressions([E|Es]) --> ws, expression(E), ws, !, % single sol…
15 июн '11 в 13:37
4 ответа

Какая разница в исполнении, если вырезать "!" настоящее?

counter([],[]). counter([H|T],[[H,C1]|R]) :- counter(T,[[H,C]|R]),!, C1 is C+1. counter([H|T],[[H,1]|R]) :- counter(T,R). Каков эффект от "!" как я получаю один и тот же вывод для ввода кода выше и ниже? counter([],[]). counter([H|T],[[H,C1]|R]) :- …
09 май '17 в 05:41
0 ответов

Используя cut, ERROR: Out of local stack

Вот мой код, просто сфокусируйтесь на 3 последних правилах: father(costac,anne). mother(mary,mike). husband(costac,mary). sex_male(costac). sex_male(mike). sex_female(mary). sex_female(anne). mother(X,Y):- father(Z,Y), wife(X,Z). father(X,Y):- mothe…
17 ноя '15 в 13:50
1 ответ

Сокращение в конце утверждения Пролога

Я столкнулся с этим разрезом, который должен возвращать true, если существует ребро AB или BA для некоторого узла B графа Graph. node(A,Graph) :- adjacent(A,_,Graph),!. Проблема в том, что я не понимаю, почему удаление этого среза повлияет на возвра…
20 янв '19 в 15:44
0 ответов

Пролог логика и вырезать

У меня есть некоторые проблемы с пониманием потока пролога. вот код: h(X):- 1 is X mod 2, write(X), nl, 0 is X mod 3, !, fail. h(_). t(_,[],0). t(M,[_|LS],1):-member(M,LS),write('member'), nl,fail. t(_,[H|_],H). r([X|LS],R):-h(X), M is 2*X+1,t(M, LS…
09 июл '17 в 10:56
2 ответа

Пролог: избегайте лишних точек выбора (недетерминизм) с оператором вырезания и без него

Во-первых, я прочитал все другие посты на SO, касающиеся использования разрезов в Прологе, и определенно вижу проблемы, связанные с их использованием. Однако для меня все еще есть некоторая неясность, и я хотел бы решить это раз и навсегда. В привед…
2 ответа

Неужели это плохо в программировании?

Эй, ребята, в этом семестре я прохожу курс ИИ, на котором мы изучаем Пролог. Наш лектор сказал нам, чтобы мы старались избегать использования сокращений в нашем задании, однако, по паре вопросов я не могу их избежать. Мне просто любопытно, почему по…
09 апр '14 в 17:29
3 ответа

Что такое дерево SLD для этого запроса?

Рассмотрим следующую программу Пролог (из "Искусство Пролога"): natural_number(0). natural_number(s(X)) :- natural_number(X). plus(X, 0, X) :- natural_number(X). plus(X, s(Y), s(Z)) :- plus(X, Y, Z). и запрос: ?- plus(s(s(s(0))), s(0), Z). И SICStus…
31 окт '12 в 16:43
0 ответов

Предотвращение возврата без среза

Довольно плохо знаком с прологом и пытаюсь решить некоторые упражнения. Учитывая базу знаний компонентов component(ElementX,ElementY,Qty). ElementX uses ElementY in it's structure in quantity Qty. component(car, door, 4). component(car, wheel, 4). c…
07 окт '18 в 23:34
1 ответ

Как сокращение точек выбора в приведенном ниже коде делает его более эффективным (Пролог)?

В приведенном ниже коде есть ! (вырезать), который сокращает точку выбора для эффективности. Я уверен, что reverse предикат и agent_do_moves Предикат необходимы. solve_task(Task,Cost):- agent_current_position(oscar,P), solve_task_a(Task,[b(0,0,P)],[…
13 июн '15 в 23:51
1 ответ

Пролог - понимание использования разреза

Я не могу ясно понять использование разреза. Например, в этом случае: сгладить, это действительно нужно? Это работает для меня даже без обоих предикатов вырезать (я пытался удалить). В каких случаях обратный ход может привести к сокращению? Снятие р…
14 сен '15 в 15:46
2 ответа

Почему мы используем '!' в прологе

Это код, который я пытаюсь понять. co(X) :- co(X,[],L). co([],A,A):- write(A). co([X|Xs], A, L) :- p(X-Z,A,R), !, Z1 is Z+1, co(Xs, [X-Z1|R], L). co([X|Xs], A, L) :- co(Xs, [X-1|A], L). p(X-Y,[X-Y|R],R):- !. p(X,[H|Y], [H|Z]) :- p(X,Y,Z). Какая поль…
14 ноя '14 в 10:15
1 ответ

Каковы оптимальные зеленые срезы для суммы арифметики преемника?

Чтобы получить зеленые сокращения в Прологе, я пытаюсь добавить их к стандартному определению суммы в арифметике-преемнике (см. Предикат plus Что такое дерево SLD для этого запроса?). Идея состоит в том, чтобы "очистить" вывод как можно больше, искл…
2 ответа

Пролог обрезал поведение оператора

У меня есть эти пункты: a(1). a(2). b(a). c(A,B,C) :- a(A),d(B,C). c(A,B,C) :- b(A),d(B,C). d(B,C) :- a(B),!,a(C). d(B,_) :- b(B). Когда я запускаю запрос c(X,Y,Z), ответы таковы: X = 1, Y = 1, Z = 1 ; X = 1, Y = 1, Z = 2 ; X = 2, Y = 1, Z = 1 ; X =…
15 май '13 в 10:39
0 ответов

Рефакторинг нарезки в DCG, общие принципы? [ответ на комментарии]

Рассмотрим пункт с вырезом f(X) :- g(X), !, h(X). Я думаю, что это здравый смысл, что мы можем реорганизовать сокращения следующим образом: h1(X) :- !, h(X). f(X) :- g(X), h1(X). Однако для DCG подобный макроподобный рефакторинг для разрезов, похоже…
14 ноя '16 в 16:11
2 ответа

Заставьте Prolog вернуть одно решение и перестать показывать опцию запроса

Я новичок в прологе и экспериментирую с тем, как заставить его перестать запрашивать после того, как он найдет один ответ. Я использую этот код: member1(L,[L|_]). member1(L,[_|RS]) :- member1(L,RS),!. Результат: | ?- member1(3,[3,2,3]). true ? a yes…
24 ноя '13 в 20:07
2 ответа

Пролог Использование порезов

Я переписываю следующую функцию в Прологе: V1: f(X,Y):- X < 2, Y is X+1. f(X,3):- 2 =< X, X < 5. f(X,Y):- 5 =< X, Y is 8-X. Как V2: f(X,Y) :- X < 2, Y is X + 1. f(X,Y) :- X >= 2, X < 5, Y is 3. f(X,Y) :- X >= 5, Y is 8-X. Зат…
31 май '14 в 17:53