Учитывая word/1,
word(W) :-
abs(ABs),
ABs = W.
abs([]).
abs([AB|ABs]) :-
abs(ABs),
ab(AB).
ab(a).
ab(b).
?- word(W).
W = []
; W = [a]
; W = [b]
; W = [a,a]
; W = [b,a]
; W = [a,b]
; W = [b,b]
; W = [a,a,a]
; W = [b,a,a]
; W = [a,b,a]
; W = [b,b,a]
; W = [a,a,b]
; W = [b,a,b]
; W = [a,b,b]
; W = [b,b,b]
; W = [a,a,a,a]
...
как выглядит более компактное определение word/1, в противном случае оно идентично w.r.t. завершение и набор решений, справедливость, со следующими ограничениями:
-
Не использовать встроенные функции, например
(=)/2. -
Использование конструктов управления, таких как
(',')/2или(;)/2, илиcall/1. -
Использует один факт, одно рекурсивное правило и одно правило для
word/1.
Возможно, проще попросить выражения F1... F4 в:
word(W) :-
p(F1).
p(F2).
p(F3) :-
p(F4).
Для записи: свойство, используемое здесь, тесно связано с неразрешимостью завершения одного бинарного предложения. Хвалите:
Филипп Девенен, Патрик Лебе, Жан-Кристоф Мартиер и Йорг Вюрц. Достаточно одного предложения бинарного рожка STACS '94.