Re: [eclipse-clp-users] Searching working memory without destructive unification?

From: -dp- <david_at_wooden-robot.net>
Date: Wed, 25 Nov 2009 18:24:55 +0800
I'm sorry, I somehow forgot the essentials of Prolog.

FWIW, I was trying to design a solution to a parser design problem mentioned
by Gazdar & Mellish in "Natural language processing in Prolog" (1989) p.
253:

"What implications do these issues have for chart parser implementation?
First of all, they mean that destructive unification cannot be used in the
generation of new edges [...] The obvious solution to these problems is to
always use copies for unification."

On Sat, Nov 14, 2009 at 1:56 AM, Kish Shen <kisshen_at_cisco.com> wrote:

> -dp- wrote:
>
>> I need to search working memory with a query that contains a mixture of
>> atoms and variables, and the functor and arity of the query will change
>> (in
>> a data-driven design).
>>
>> It's important that the contents of working memory not change as a result
>> of
>> such search, such as a variable being bound to an atom or compound term in
>> the query.
>>
>> I haven't been able to find a predicate for non-destructive unification
>> (e.g., it might keep bindings in one of its arguments), and my current
>> best
>> idea is to construct a dummy query with the same functor and arity but
>> will
>> all new free vars. After each successful destructive unification with a
>> dummy query, I'd use my own non-destructive unification predicate to
>> compare
>> the found item with the real query.
>>
>> Is there an easier way to do this?
>>
>>  Hi David,
>
> I am not sure I understand in detail what you are trying to do, but your
> wording of the problem suggest you are not really thinking in a Prolog way
> -- there is really no concept of "working memory", nor is unification
> "destructive". I also don't really understand what your "search" is doing
> exactly...
>
> For example, by working memory, do you mean runtime variables and their
> bindings, or do you mean something else (e.g. clauses (including facts) in
> your program)?
>
> If you are talking about variables that occur in your source fact/clauses
> (your talk about queries seem to suggest this might be what you mean), then
> these are not runtime variables, e.g. if I have the following fact in my
> program,
>
> fact(1, A).
>
> then calling the query "fact(1, 3)" will not change the "A" in your program
> source to 3, you can check this by calling fact/1 twice:
>
> fact(1,3), fact(1,New)
>
> New will remain uninstantiated.
>
> On the other hand, if you are talking about run-time terms, and you want to
> compare two terms without binding any variables, you can use ==/2 to do
> this.
>
> If you really need to perform unification, and you are only interested in
> the result (i.e. success or failure), and you don't want to bind anything,
> there is a well known Prolog trick of using \+/2 twice to do this, e.g.:
>
>    \+ \+(A=B)
>
> Your question seem to suggest that you may not be very familiar with
> programming in Prolog -- if this is so, you may want to read some textbook
> on Prolog -- the points I mention should all be covered in any introductory
> book on Prolog.
>
> Cheers,
>
> Kish
>
Received on Wed Nov 25 2009 - 10:25:07 CET

This archive was generated by hypermail 2.2.0 : Thu Feb 02 2012 - 02:31:58 CET