list - 如何在Prolog中列出对象?

标签 list prolog

我可以使用以下代码和查询将单个对象添加到列表中:

makelist(A, B, C, X) :- append([1, 2, 3],A, X).

?- makelist(a, b, c, X).
X = [1, 2, 3|a].

但是,不是通常的分隔符逗号 (,),而是垂直线分隔符 (|),我无法将另一个对象添加到同一列表中:

makelist(A, B, C, X) :- append([1, 2, 3],A, X), append(X,B, X).

?- makelist(a, b, c, X).
false.

最佳答案

有几个误解。首先,列表及其元素被混淆,这导致了“点对”,即 |a]。那么,看来你对变量的作用还不太清楚。

在目标 append([1,2,3],A,X) 中,AX 都应该是列表。但是,您将 A 设置为 a,它不是列表。背后的问题是 append/3 接受第二个参数的任何术语。要了解这一点,只需查看其答案即可:

?- append([1,2,3],A,X).
X = [1,2,3|A].

因此,A 可以是任何内容,但它应该只是一个列表。

?- A = a, append([1,2,3],A,X).
   A = a, X = [1,2,3|a].

请注意,append/3 坚持第一个参数是列表(或部分列表)。一旦你有了一个坏列表,你就不能再进一步追加它了。即:

?- A = a, append([1,2,3],A,X), append(X, _, _).
   false.

请注意,我没有按字面意思使用你的定义。相反,我用 _ 替换了某些参数,因为它们没有帮助。

第二个问题源于目标append(X, B, X)。这个目标B = []时才成立。让我们试试这个:

?- append(X, B, X).
   X = [], B = []
;  X = [_A], B = []
;  X = [_A,_B], B = []
;  X = [_A,_B,_C], B = []
;  ... .

还有:

?- B = [_|_], append(X, B, X).
   loops.

虽然X有很多答案,但B始终是[]

关于list - 如何在Prolog中列出对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23185658/

相关文章:

prolog - 查找与原子相关的所有子句

python - 使用负索引调整大小列出切片分配

odbc - 插入 postgresql 时 swi-prolog odbc 错误

c++ - 如何在C++中以二进制方式将列表容器写入文件

列表的 Python 拆分

java - Hello hello prolog 和 weka 集成

prolog - 还有什么更有趣或更强大的功能: curry , Mercurial 或Lambda-序言?

Prolog 适合初学者的逻辑和语法

python - 将python sql列表转换为字典

css - 居中水平无序列表,没有固定宽度