Я согласен с @mat, что следует использовать dcg, когда это возможно для этих типов задач.
Это - другие правила.
abs --> [a].
abs --> [a,b].
abs --> [a,b], abs.
?- phrase(abs, Ls).
Ls = [a] ;
Ls = [a, b] ;
Ls = [a, b, a] ;
Ls = [a, b, a, b] ;
Ls = [a, b, a, b, a] ;
Ls = [a, b, a, b, a, b] ;
Ls = [a, b, a, b, a, b, a] ;
Ls = [a, b, a, b, a, b, a, b] ;
Ls = [a, b, a, b, a, b, a, b, a]
Интересно эти правила начали с этого изменения
abs2 --> [].
abs2 --> [a].
abs2 --> [a,b], abs2.
?- phrase(abs2, Ls).
Ls = [] ;
Ls = [a] ;
Ls = [a, b] ;
Ls = [a, b, a] ;
Ls = [a, b, a, b] ;
Ls = [a, b, a, b, a] ;
Ls = [a, b, a, b, a, b] ;
Ls = [a, b, a, b, a, b, a] ;
Ls = [a, b, a, b, a, b, a, b]
, который является одним из упражнений из Using Definite Clause Grammars in SWI-Prolog
Если вы предпочитаете не использовать DCG, то я согласен с @mat и предположить, что вы используете listing/1
, чтобы увидеть DCG в стандартном синтаксисе Prolog.
listing(abs).
abs([a|A], A).
abs([a, b|A], A).
abs([a, b|A], B) :-
abs(A, B).
listing(abs2).
abs2(A, A).
abs2([a|A], A).
abs2([a, b|A], B) :-
abs2(A, B).
В нормальных правил Пролога они могут быть использованы в качестве таковых:
abs(X,[]).
X = [a] ;
X = [a, b] ;
X = [a, b, a] ;
X = [a, b, a, b] ;
X = [a, b, a, b, a] ;
X = [a, b, a, b, a, b] ;
X = [a, b, a, b, a, b, a]
abs2(X,[]).
X = [] ;
X = [a] ;
X = [a, b] ;
X = [a, b, a] ;
X = [a, b, a, b] ;
X = [a, b, a, b, a] ;
X = [a, b, a, b, a, b]
Спасибо! Это интересно, не наткнуться на него раньше, и мы, конечно, не узнаем его в нашем курсе в моем университете, это ценная информация! В любом случае, я тренирую свои рекурсионные убийства и создаю сценарии генерации, и я не уверен, будут ли DCG приняты на моем экзамене, поэтому я все еще ищу решение по традиционному пути :) –
Если «традиционным способом», вы имеете в виду «менее читаемым способом», просто используйте следующий запрос, чтобы получить простой код Пролога, соответствующий DCG: '? - listing (abs // 0), список (abs_rest // 0). Вы можете взять свой вывод , передайте его своему инструктору и знайте, что есть лучшее решение, которое вам, вероятно, не разрешено использовать, потому что зачем использовать подходящий формализм, когда есть более сложный способ выразить одно и то же? – mat
Традиционное не было подходящим словом для описания того, что мне нужно. Я пытаюсь понять это, используя только функции Head, Tail и recursion в списках. Таким образом: ab ([a]). ab ([b, a | T]): - ab ([a | T]). ab ([a, b | T]): - ab ([b | T]). –