Negation In Prolog
- From: samuel.kelly@xxxxxxxxx
- Date: 18 Oct 2005 19:44:45 -0700
[Last post was titled wrong. Don't let the subject
confuse you; it is not the question I am asking!]
Hi,
I have been looking at Prolog over the last week or so and have a
question about negation.
I have been trying to write a question and in the process have thought
a little about negation in Prolog. Am I off the mark in my
understanding?:
----------
The logical statement
not(p(X1, X2, ..., Xn))
basically means "No X1, X2, ..., and Xn exist where p(X1, ... Xn)."
However, in Prolog, this only works if all of Xi are first given a
finite universe of possible values, before not(p(...)) is considered.
Is this true?
As a practical example, in a "family tree" Prolog program/database,
you might try to include the rule
single(X) :- not(married(X)).
but this won't work with the query single(Q) because you have not
established a finite universe for Q. You could instead say:
single(X) :- person(X), not(married(X)).
and make sure that person(X) is true for all the "people" you are
concerned about.
----------
Is that correct?
I cannot think of a situation where you would need an infinite
universe. I have thought about, for example, the natural numbers as an
infinite universe for an argument to NOT(p(...)) but it seems the
rule can always be rewritten to not us NOT.
For example, in
negative(X) :- X < 0.
nonnegative(X) :- not(negative(X).
nonnegative can just be written:
nonnegative(X) :- X >= 0.
Are they any examples you know of where an easy rewrite like this is
not possible?
Thanks,
Sam
Hi,
I have been looking at Prolog over the last week or so and have a
question about negation.
I have been trying to write a question and in the process have thought
a little about negation in Prolog. Am I off the mark in my
understanding?:
----------
The logical statement
not(p(X1, X2, ..., Xn))
basically means "No X1, X2, ..., and Xn exist where p(X1, ... Xn)."
However, in Prolog, this only works if all of Xi are first given a
finite universe of possible values, before not(p(...)) is considered.
Is this true?
As a practical example, in a "family tree" Prolog program/database,
you might try to include the rule
single(X) :- not(married(X)).
but this won't work with the query single(Q) because you have not
established a finite universe for Q. You could instead say:
single(X) :- person(X), not(married(X)).
and make sure that person(X) is true for all the "people" you are
concerned about.
----------
Is that correct?
I cannot think of a situation where you would need an infinite
universe. I have thought about, for example, the natural numbers as an
infinite universe for an argument to NOT(p(...)) but it seems the
rule can always be rewritten to not us NOT.
For example, in
negative(X) :- X < 0.
nonnegative(X) :- not(negative(X).
nonnegative can just be written:
nonnegative(X) :- X >= 0.
Are they any examples you know of where an easy rewrite like this is
not possible?
Thanks,
Sam
.
- Follow-Ups:
- Re: Negation In Prolog
- From: Duncan Patton
- Re: Negation In Prolog
- From: Mauro Di Nuzzo
- Re: Negation In Prolog
- References:
- How to express (NOT A) AND (NOT B)
- From: samuel . kelly
- How to express (NOT A) AND (NOT B)
- Prev by Date: How to express (NOT A) AND (NOT B)
- Next by Date: [NEWBIES] Problem to understand "Prolog Vocabulary"
- Previous by thread: How to express (NOT A) AND (NOT B)
- Next by thread: Re: Negation In Prolog
- Index(es):
Relevant Pages
|
|