Учитывая 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.