Почему в некоторых тестовых случаях DCG используется утверждение (Rest == [])? - PullRequest
0 голосов
/ 25 марта 2019

Этот ответ использует assertion( Rest == [] )?

pharse / 3 is

phrase(:DCGBody, ?List, ?Rest)

Поскольку фраза / 2 эквивалентна phrase(DCGBody, InputList, [])., что составляет всего Rest = [], а в тестовом примере Rest == [], какой смысл? Какую пользу дает добавление assertion( Rest == [] )?

1 Ответ

2 голосов
/ 25 марта 2019

phrase(GB__2, Xs, []) эквивалентно phrase(GB__2, Xs), но это не обязательно тот случай, когда первое решение phrase(GB__2, Xs0,Xs) будет Xs == [].

Вот минимальный пример:

:- set_prolog_flag(double_quotes, chars).

ao1 --> "a" | [].

ao2 --> [] | "a".

В то время как phrase(aoX, "a") просто успешен для обоих, phrase(aoX, "a", Xs) показывает разницу в последовательности найденных решений.

?- phrase(ao1, "a", Xs).
      Xs = "a"
   ;  Xs = [].
?- phrase(ao2, "a", Xs).
      Xs = []
   ;  Xs = "a".
...