1

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

在我的程序中导致问题的地方,这就是堆栈的内容:

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

我通过运行跟踪得到了这个,它应该持有什么堆栈。

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

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

如果我这样做,那么规则将按预期执行。但是我需要在这里使用一个变量而不是使用“and stack([[s]],[np,[noun,john]])”。但是,当我尝试使用其他任何东西时,该规则不会触发。我不知道为什么。当我在列表中使用变量时,其他规则可以正常工作。

我试过了

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

我不完全确定是什么导致了这个问题

4

1 回答 1

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]]
于 2013-09-24T12:58:05.427 回答