2016-01-26 2 views
1

Я хочу разбить слова из строки и поместить в список в Prolog.Разделить слова из строки в Prolog

num --> [one] | [two] | [three] | [four] | [five]. 

?- split("onethreetwofive", Ls). 
Ls = [one,three,two,five].    % expected answer 

Здесь, я хочу, чтобы разбить строку с сопоставления списка из num и поставить слова в списке. Я использую SWI-Prolog. Есть идеи? Благодаря!

+0

Вы пробовали что-нибудь вообще? Вы просмотрели предикаты обработки атома и строки в SWI Prolog? Оператор '->' предназначен для определения DCG. Это то, что вы намерены? – lurker

ответ

0

Давайте попробуем этот код.
:-set_prolog_flag(double_quotes, codes).
any(A,K) --> {member(S,K)}, S, {atom_codes(A, S)}.
num(S) --> any(S, ["one","two","three","four","five"]).
nums([]) --> "".
nums([X|Xs]) --> num(X), nums(Xs).

split(Str,Ls):-phrase(nums(Ls),Str).

Ok Теперь Давайте запустим запрос.
?- split("onethreetwofive", Ls).
Ls = [one, three, two, five] ;

3

Использование !

 
:- set_prolog_flag (double_quotes , chars). 

num --> "one" | "two" | "three" | "four" | "five". 

nums --> "". 
nums --> num, nums. 

Использование SWI-Prolog 7.3.15:

 
?- phrase (nums, Cs). 
Cs = [] ; 
Cs = [o, n, e] ; 
Cs = [o, n, e, o, n, e] ; 
Cs = [o, n, e, o, n, e, o, n, e] ; 
... 

?- phrase(nums, "onethreetwofive"). 
true ; 
false. 

OK! Далее, мы делаем шаг вверх от num//0 к num//1 и от nums//0 к nums//1:

num(one) --> "one". 
num(two) --> "two". 
num(three) --> "three". 
num(four) --> "four". 
num(five) --> "five". 

nums([])  --> "". 
nums([X|Xs]) --> num(X), nums(Xs). 

Бежим запрос ОП предложенный!

?- phrase(nums(Ls), "onethreetwofive"). 
Ls = [one, three, two, five] ; 
false. 
Смежные вопросы