首页 > 解决方案 > 将关系变为事实

问题描述

我想在prolog中问一个非常基本的问题。我有一个看起来像的列表列表[[a_1,a],[a_2,c],[a_3,e,f]]。我想创建一个获取该列表并为每个子列表添加一个中缀的关系。例如,我想插入x为中缀:x([[a_1,a]),x([a_2,c]),x([a_3,e,f]])。目标是使这种关系成为事实。我试图使用findall但没有任何成功。

例子:

turn([[a_1,a],[a_2,c],[a_3,e,f]]).

输出:

[x([a_1,a]),x([a_2,c]),x([a_3,e,f])].

如何实施?

标签: prolog

解决方案


[x([a])]本身并不是一个事实。这只是一个不同的 Prolog术语形式。事实是在数据库中断言的术语,不代表谓词,并且可以查询。听起来您不想转换为“事实”,但您只想转换为不同的术语形式。

在这种情况下很容易maplist

turn_item(X, x(X)).

turn(TermList, NewTermList) :-
    maplist(turn_item, TermList, NewTermList).

然后:

| ?- turn([[a_1,a],[a_2,c],[a_3,e,f]], L).

L = [x([a_1,a]),x([a_2,c]),x([a_3,e,f])]

yes

推荐阅读