# Module finding calling program DCG predicates

**URL:** <https://swi-prolog.discourse.group/t/module-finding-calling-program-dcg-predicates/963>\
**Category:** Help!\
**Created:** [July 17, 2019, 12:00pm UTC](https://swi-prolog.discourse.group/t/module-finding-calling-program-dcg-predicates/963 "2019-07-17T12:00:50Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mcculloch](https://avatars.discourse-cdn.com/v4/letter/m/ad7895/32.png) [@mcculloch](https://swi-prolog.discourse.group/u/mcculloch)\
**Post date:** [July 17, 2019, 12:00pm UTC](https://swi-prolog.discourse.group/t/module-finding-calling-program-dcg-predicates/963/1 "2019-07-17T12:00:50Z")

</div>

I’m using: SWI-Prolog version 8.1.6

Here’s simplified version of a module I have.

```prolog
:- module(parse_tools,[]).
:- use_module(library(dcg/basics)).

:- export(quot_csv//1).
quot_csv(Value) --> { var(Value) },`"`,string(Value),`"`,!,(`,`;eos).
quot_csv(DCG) --> `"`,DCG,`"`,!,(`,`;eos).

mdy(M,D,Y) --> blanks,integer(M),`/`,integer(D),`/`,integer(Y),string(_).

cash(Number) --> blanks,prefix,float(Number),string(_).

prefix,`0.` --> `$`,blanks,`.`,!.
prefix,`-` --> `-$`,blanks,!.
prefix --> `$`,blanks.

```

The intent is for calling program to be able to able to use something like:

```prolog
phrase(lin(M,D,Y,Cash),Line,_),
% more stuff using M,D,Y and Cash.

lin(M,D,Y,Cash) --> quot_csv(mdy(M,D,Y)),quot_csv(cash(Cash)).

```

This works fine, but I want to allow the calling program to use its own custom DCG with quote\_csv//1. But then quot\_csv//1 won’t be able to find it since it’s in a different module. What is the most direct way to do this.

Thanks,  
John

---

<div class="post-metadata">

**Author:** ![michaelby](https://avatars.discourse-cdn.com/v4/letter/m/b3f665/32.png) [@michaelby](https://swi-prolog.discourse.group/u/michaelby)\
**Post date:** [July 17, 2019, 12:04pm UTC](https://swi-prolog.discourse.group/t/module-finding-calling-program-dcg-predicates/963/2 "2019-07-17T12:04:50Z")

</div>

> [@mcculloch](#):
>
> What is the most direct way to do this.

Declare `quot_csv//1` as [a meta-predicate](https://www.swi-prolog.org/pldoc/man?section=metapred).

---

<div class="post-metadata">

**Author:** ![CapelliC](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/capellic/32/17_2.png) [@CapelliC](https://swi-prolog.discourse.group/u/CapelliC)\
**Post date:** [July 17, 2019, 5:29pm UTC](https://swi-prolog.discourse.group/t/module-finding-calling-program-dcg-predicates/963/3 "2019-07-17T17:29:25Z")

</div>

I would add it to export list of the module where it’s defined (btw, why you opted for the directive export/1 ?):

```prolog
:- module(parse_tools,[lin//4]).

```

Anyway, beware of this construct

```prolog
, string(_).

```

It could make your parse time exponential, and surely make your grammar difficult to debug. Try to be more specific…

---

<div class="post-metadata">

**Author:** ![mcculloch](https://avatars.discourse-cdn.com/v4/letter/m/ad7895/32.png) [@mcculloch](https://swi-prolog.discourse.group/u/mcculloch)\
**Post date:** [July 17, 2019, 5:42pm UTC](https://swi-prolog.discourse.group/t/module-finding-calling-program-dcg-predicates/963/4 "2019-07-17T17:42:02Z")

</div>

quot\_csv has cuts in it to account for choice points like those left by string//1.

---

<div class="post-metadata">

**Author:** ![mcculloch](https://avatars.discourse-cdn.com/v4/letter/m/ad7895/32.png) [@mcculloch](https://swi-prolog.discourse.group/u/mcculloch)\
**Post date:** [July 17, 2019, 6:18pm UTC](https://swi-prolog.discourse.group/t/module-finding-calling-program-dcg-predicates/963/5 "2019-07-17T18:18:08Z")

</div>

Thanks! I declared quot\_csv as:

```prolog
:- meta_predicate(quot_csv(//)).

```

I also got rid of the option to pass a variable instead. All one has to do is call:

```prolog
quote_csv(string(S))

```

And S will get everything anyway and it satisfies the meta\_predicate requirement.
