为什么我没有比赛?

时间:2013-09-24 10:11:58

标签: prolog artificial-intelligence

我有一个名为“stack”的列表结构。

在我的程序中导致问题的那一点,这就是堆栈的含义:

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

我从运行跟踪得到了这个,它应该是什么堆栈。

在编写应与之匹配的下一条规则时。

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

如果我这样做,那么规则就像它应该的那样执行。但我需要在这里使用变量而不是使用“和stack([[s]],[np,[noun,john]])”。但是,当我尝试使用其他任何东西时,规则不会触发。我无法理解为什么。当我在列表中使用变量时,其他规则工作正常。

我试过

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

我不完全确定导致此问题的原因

1 个答案:

答案 0 :(得分:3)

您的堆栈似乎有arity 2,其中每个arg都是一个列表。

这些不是列表的有效语法

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

但由于某些Prolog声明(|)/ 2运算符是(;)/ 2的替代(即析取),因此您不会看到任何语法错误。

要了解您的问题,您可以尝试统一,通过统一运算符(=)/ 2

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

你会得到

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