From 3faf36440ca5938accf072cac1ccdd87430dc4db Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 31 Mar 2020 01:23:00 +0200 Subject: [PATCH 1/3] naming: partial_list_ws//1 --> list_ws//1 A DCG describes a list, so "list" is an appropriate name. --- src/prolog/examples/bimetatrans_ruleml.pl | 88 +++++++++++------------ 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/prolog/examples/bimetatrans_ruleml.pl b/src/prolog/examples/bimetatrans_ruleml.pl index 142d9d1e..9a325fde 100644 --- a/src/prolog/examples/bimetatrans_ruleml.pl +++ b/src/prolog/examples/bimetatrans_ruleml.pl @@ -65,8 +65,8 @@ parse_ruleml(AssertItem, QueryItem, XML) :- */ parse_header --> - partial_string_ws(""), - partial_string_ws(""), + list_ws(""). @@ -176,10 +176,10 @@ ruleml_top_level_items(AssertItem, QueryItems) --> ruleml_assert(Items) --> ( { var(Items) } -> - partial_string_ws(""), + list_ws(""), ruleml_assert_items(Items), !, - partial_string_ws("") + list_ws("") ; partial_string(""), { Items \== [] }, ruleml_assert_items(Items), @@ -244,13 +244,13 @@ ruleml_query_items([]) --> []. ruleml_query_item(Item) --> ( { var(Item) } -> - partial_string_ws(""), + list_ws(""), ( ruleml_condition(Item0), { Item = (?- Item0) } -> { true } ; { true } ), - partial_string_ws("") + list_ws("") ; partial_string(""), { Item = (?- Item0) }, ruleml_condition(Item0), @@ -264,7 +264,7 @@ ruleml_query_item(Item) --> * items. Whitespace, for example, is discarded immediately after * being read. * - * partial_string_ws reads a string into its argument as a partial + * list_ws reads a string into its argument as a partial * string before consuming any following whitespace. */ @@ -283,7 +283,7 @@ sign('+') --> "+". double_quote('"') --> "\"". -partial_string_ws(String) --> +list_ws(String) --> partial_string(String), ws. @@ -370,7 +370,7 @@ ruleml_item_conjunction([]) --> []. ruleml_conjunction_of_items(Items) --> ( { var(Items) } -> - partial_string_ws(""), + list_ws(""), ruleml_item_conjunction(ItemsList), ( { ItemsList = [_,_|_] } -> { fold_commas(ItemsList, Items) } @@ -379,7 +379,7 @@ ruleml_conjunction_of_items(Items) --> ; { ItemsList = [] } -> { Items = (true, true) } ), - partial_string_ws("") + list_ws("") ; partial_string(""), ( { Items = (true, true) } -> { true } @@ -417,7 +417,7 @@ ruleml_item_disjunction([]) --> []. ruleml_disjunction_of_items(Items) --> ( { var(Items) } -> - partial_string_ws(""), + list_ws(""), ruleml_item_disjunction(ItemsList), ( { ItemsList = [_,_|_] } -> { fold_semicolons(ItemsList, Items) } @@ -426,7 +426,7 @@ ruleml_disjunction_of_items(Items) --> ; { ItemsList = [] } -> { Items = (false ; false) } ), - partial_string_ws("") + list_ws("") ; partial_string(""), ( { Items = (false ; false) } -> { true } @@ -485,16 +485,16 @@ split_plex(Xs, PlexItems, RepoItem) :- ruleml_plex(Plex) --> ( { var(Plex) } -> - ( partial_string_ws("") -> + ( list_ws("") -> ruleml_items(PlexItems), - ( partial_string_ws("") -> + ( list_ws("") -> ruleml_var(RepoVar), - partial_string_ws(""), + list_ws(""), { append(PlexItems, RepoVar, Plex) } ; { Plex = PlexItems } ), - partial_string_ws("") - ; partial_string_ws("") + list_ws("") + ; list_ws("") ) ; { \+ string(Plex), acyclic_term(Plex) }, @@ -526,10 +526,10 @@ ruleml_plex(Plex) --> ruleml_naf(Item) --> ( { var(Item) } -> - partial_string_ws(""), + list_ws(""), ruleml_condition(NafItem), { Item = (\+ NafItem) }, - partial_string_ws("") + list_ws("") ; partial_string(""), { Item = (\+ NafItem) }, ruleml_condition(NafItem), @@ -577,13 +577,13 @@ ruleml_atoms([]) --> []. ruleml_atom(Item) --> ( { var(Item) } -> - partial_string_ws(""), - partial_string_ws(""), + list_ws(""), + list_ws(""), prolog_symbol(Name), { Name \== (','), Name \== (';') }, - partial_string_ws(""), + list_ws(""), ruleml_items(Args), - partial_string_ws(""), + list_ws(""), { Item =.. [Name | Args] } ; { Item =.. [Name | Args] }, { Name \== (','), Name \== (';') }, @@ -642,20 +642,20 @@ ruleml_item(Item) --> ruleml_expr(Item) --> ( { var(Item) } -> - partial_string_ws(""), - partial_string_ws(""), + list_ws(""), + list_ws(""), prolog_symbol(Name), - partial_string_ws(""), + list_ws(""), ruleml_items(Args), - ( partial_string_ws(""), + ( list_ws(""), ruleml_item(RepoItem), - partial_string_ws(""), + list_ws(""), !, { fold_commas(Args, ArgsCommas) }, { Item =.. [Name, (ArgsCommas | RepoItem)] } ; { Item =.. [Name | Args] } ), - partial_string_ws("") + list_ws("") ; { Item =.. [Name | Args] }, partial_string(""), partial_string(""), @@ -686,9 +686,9 @@ ruleml_expr(Item) --> ruleml_ind(Name) --> ( { var(Name) } -> - partial_string_ws(""), + list_ws(""), ruleml_ind_helper(Cs), - partial_string_ws(""), + list_ws(""), { atom_chars(Name, Cs) } ; { atom(Name) }, partial_string(""), @@ -728,11 +728,11 @@ ruleml_ind_helper(Cs) --> ruleml_var(Var) --> ( { var(Var) } -> - partial_string_ws(""), + list_ws(""), ruleml_var_contents(VarChars), { atom_chars(VarName, VarChars) }, { Var = '$V'(VarName) }, - partial_string_ws("") + list_ws("") ; { Var = '$V'(VarName) }, partial_string(""), { atom_chars(VarName, VarChars) }, @@ -801,12 +801,12 @@ constant_chars(symbol, Constant, Chars) :- ruleml_data(Name) --> ( { var(Name) } -> - partial_string_ws(""), + list_ws("\">"), ruleml_data_contents(Type, Cs), { constant_chars(Type, Name, Cs) }, - partial_string_ws("") + list_ws("") ; partial_string(" ruleml_implies(Rule) --> ( { var(Rule) } -> - partial_string_ws(""), - partial_string_ws(""), + list_ws(""), + list_ws(""), ruleml_implies_head(Head), - partial_string_ws(""), - partial_string_ws(""), + list_ws(""), + list_ws(""), ruleml_condition(Body), - partial_string_ws(""), - partial_string_ws(""), + list_ws(""), + list_ws(""), { Rule = ( Head :- Body ) } ; { Rule = ( Head :- Body ) }, partial_string(""), @@ -1082,10 +1082,10 @@ ruleml_equal_item(EqualItem) --> ruleml_equal(Equal) --> ( { var(Equal) } -> - partial_string_ws(""), + list_ws(""), ruleml_equal_item(Left), ruleml_equal_item(Right), - partial_string_ws(""), + list_ws(""), { Equal = (Left = Right) } ; { Equal = (Left = Right) }, partial_string(""), From a89f03f27d2d8dfcdaa1693bab7e9cf05aee39c3 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 31 Mar 2020 01:24:15 +0200 Subject: [PATCH 2/3] embed literal lists directly in DCGs Example use of direct embedding: ?- phrase("abc", Ls0, Ls). Ls0 = [a,b,c|Ls]. --- src/prolog/examples/bimetatrans_ruleml.pl | 80 +++++++++++------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/src/prolog/examples/bimetatrans_ruleml.pl b/src/prolog/examples/bimetatrans_ruleml.pl index 9a325fde..7c0028d5 100644 --- a/src/prolog/examples/bimetatrans_ruleml.pl +++ b/src/prolog/examples/bimetatrans_ruleml.pl @@ -180,11 +180,11 @@ ruleml_assert(Items) --> ruleml_assert_items(Items), !, list_ws("") - ; partial_string(""), + ; "", { Items \== [] }, ruleml_assert_items(Items), !, - partial_string("") + "" ). @@ -251,10 +251,10 @@ ruleml_query_item(Item) --> ; { true } ), list_ws("") - ; partial_string(""), + ; "", { Item = (?- Item0) }, ruleml_condition(Item0), - partial_string("") + "" ). @@ -380,7 +380,7 @@ ruleml_conjunction_of_items(Items) --> { Items = (true, true) } ), list_ws("") - ; partial_string(""), + ; "", ( { Items = (true, true) } -> { true } ; { Items = (true, Item0) } -> @@ -389,7 +389,7 @@ ruleml_conjunction_of_items(Items) --> { unfold_commas(Items, ItemsList) }, ruleml_item_conjunction(ItemsList) ), - partial_string("") + "" ). /* @@ -427,7 +427,7 @@ ruleml_disjunction_of_items(Items) --> { Items = (false ; false) } ), list_ws("") - ; partial_string(""), + ; "", ( { Items = (false ; false) } -> { true } ; { Items = (false ; Item0) } -> @@ -436,7 +436,7 @@ ruleml_disjunction_of_items(Items) --> { unfold_semicolons(Items, ItemsList) }, ruleml_item_disjunction(ItemsList) ), - partial_string("") + "" ). @@ -500,17 +500,17 @@ ruleml_plex(Plex) --> acyclic_term(Plex) }, ( { functor(Plex, ('.'), 2) } -> { split_plex(Plex, PlexItems, RepoVar) }, - partial_string(""), + "", ruleml_items(PlexItems), ( { RepoVar \== [] } -> - partial_string(""), + "", ruleml_var(RepoVar), - partial_string("") + "" ; { true } ), - partial_string("") + "" ; { Plex == [] } -> - partial_string("") + "" ) ). @@ -530,10 +530,10 @@ ruleml_naf(Item) --> ruleml_condition(NafItem), { Item = (\+ NafItem) }, list_ws("") - ; partial_string(""), + ; "", { Item = (\+ NafItem) }, ruleml_condition(NafItem), - partial_string("") + "" ). @@ -587,12 +587,12 @@ ruleml_atom(Item) --> { Item =.. [Name | Args] } ; { Item =.. [Name | Args] }, { Name \== (','), Name \== (';') }, - partial_string(""), - partial_string(""), + "", + "", prolog_symbol(Name), - partial_string(""), + "", ruleml_items(Args), - partial_string("") + "" ). /* @@ -657,20 +657,20 @@ ruleml_expr(Item) --> ), list_ws("") ; { Item =.. [Name | Args] }, - partial_string(""), - partial_string(""), + "", + "", prolog_symbol(Name), - partial_string(""), + "", ( { Args = [(InnerArgs | RepoItem)] } -> { InnerArgs = (_,_) -> unfold_commas(InnerArgs, InnerArgsList) ; InnerArgsList = [InnerArgs] }, ruleml_items(InnerArgsList), - partial_string(""), + "", ruleml_item(RepoItem), - partial_string("") + "" ; ruleml_items(Args) ), - partial_string("") + "" ). @@ -691,10 +691,10 @@ ruleml_ind(Name) --> list_ws(""), { atom_chars(Name, Cs) } ; { atom(Name) }, - partial_string(""), + "", { atom_chars(Name, Cs) }, ruleml_ind_helper(Cs), - partial_string("") + "" ). @@ -734,10 +734,10 @@ ruleml_var(Var) --> { Var = '$V'(VarName) }, list_ws("") ; { Var = '$V'(VarName) }, - partial_string(""), + "", { atom_chars(VarName, VarChars) }, ruleml_var_contents(VarChars), - partial_string("") + "" ). @@ -807,12 +807,12 @@ ruleml_data(Name) --> ruleml_data_contents(Type, Cs), { constant_chars(Type, Name, Cs) }, list_ws("") - ; partial_string(""), + "\">", ruleml_data_contents(Type, Cs), - partial_string("") + "" ). /* @@ -1052,14 +1052,14 @@ ruleml_implies(Rule) --> list_ws(""), { Rule = ( Head :- Body ) } ; { Rule = ( Head :- Body ) }, - partial_string(""), - partial_string(""), + "", + "", ruleml_implies_head(Head), - partial_string(""), - partial_string(""), + "", + "", ruleml_condition(Body), - partial_string(""), - partial_string("") + "", + "" ). @@ -1088,10 +1088,10 @@ ruleml_equal(Equal) --> list_ws(""), { Equal = (Left = Right) } ; { Equal = (Left = Right) }, - partial_string(""), + "", ruleml_equal_item(Left), ruleml_equal_item(Right), - partial_string("") + "" ). From 11a616917af37e485d466144733ccf6760c5e192 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 31 Mar 2020 01:28:16 +0200 Subject: [PATCH 3/3] introduce and use nonterminal list//1 Example: ?- phrase(list(Ls), Ls0). Ls = [], Ls0 = [] ; Ls = [_A], Ls0 = [_A] ; Ls = [_A,_B], Ls0 = [_A,_B] ; Ls = [_A,_B,_C], Ls0 = [_A,_B,_C] ; ... --- src/prolog/examples/bimetatrans_ruleml.pl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/prolog/examples/bimetatrans_ruleml.pl b/src/prolog/examples/bimetatrans_ruleml.pl index 7c0028d5..ea56c2e2 100644 --- a/src/prolog/examples/bimetatrans_ruleml.pl +++ b/src/prolog/examples/bimetatrans_ruleml.pl @@ -283,10 +283,13 @@ sign('+') --> "+". double_quote('"') --> "\"". -list_ws(String) --> - partial_string(String), +list_ws(Ls) --> + list(Ls), ws. +list([]) --> []. +list([L|Ls]) --> [L], list(Ls). + /* * ruleml_assert_item//1 specifies the elements of RuleML that may * appear as items in a RuleML Assert performative, an implicitly