yoonsi
yoonsi

Reputation: 754

Why am I not getting a match?

I have a list structure called "stack".

At the point in my program which is causing problems, this is what stack holds:

   stack([[s]],[np,[noun,john]])

I got this from running a trace, and its what stack is supposed to be holding.

When writing the next rule which is supposed to match this.

if
    buffer([[Word|_]])
    and aux(Word)
    and stack([s],[np,[noun, john]])

If I do this then the rule executes as its supposed to. But I need to use a variable here instead of using "and stack([[s]],[np,[noun,john]])". However when I try to use anything else, the rule does not fire. I can't work out why. Other rules work fine when I use variables in the list.

Ive tried

stack([s]|Foo)
stack([s]|[Foo])
stack([MyHead]|[MyTail]... and literally every other combination I can think of.

I'm not entirely sure what is causing this problem

Upvotes: 1

Views: 61

Answers (1)

CapelliC
CapelliC

Reputation: 60014

Your stack seems to have arity 2, where each arg is a list.

These aren't valid syntax for lists

stack([s]|Foo)
stack([s]|[Foo])
...

but since some Prolog declare the (|)/2 operator as alternative to (;)/2 (i.e. disjunction), you will not see any syntax error.

To understand you problem, you could try to unify, by mean of unification operator (=)/2

?- stack(S, Foo) = stack([[s]],[np,[noun,john]]).

you will get

S = [[s]]
Foo = [np,[noun,john]]

Upvotes: 3

Related Questions