Prolog 根据事实创建两个列表

Prolog 根据事实创建两个列表,prolog,Prolog,我有以下事实: 事实(1,'a')。 事实(2,'b')。 事实(3,'c')。 事实(4,'d') 我的目标是创建两个列表:一个用于ID,一个用于字符串。 所以,像这样的一个: 事实(['a','b','c','d',[1,2,3,4])。 但是根据规则 有可能吗?我知道的最简单的方法是使用library() 我知道的最简单的方法是使用library(): 如果您没有可用的对库(例如,您使用的是gprolog),这里有一个稍微复杂一些的解决方案: 所以你会打电话: fact_lists( Id

我有以下事实: 事实(1,'a')。 事实(2,'b')。 事实(3,'c')。 事实(4,'d')

我的目标是创建两个列表:一个用于ID,一个用于字符串。 所以,像这样的一个: 事实(['a','b','c','d',[1,2,3,4])。 但是根据规则


有可能吗?

我知道的最简单的方法是使用library()


我知道的最简单的方法是使用library():


如果您没有可用的
库(例如,您使用的是
gprolog
),这里有一个稍微复杂一些的解决方案:

所以你会打电话:

fact_lists( Ids, Atoms ).
并获得:

Ids = [1,2,3,4]
Atoms = ['a','b','c','d']

如果您没有可用的
库(例如,您使用的是
gprolog
),这里有一个稍微复杂一些的解决方案:

所以你会打电话:

fact_lists( Ids, Atoms ).
并获得:

Ids = [1,2,3,4]
Atoms = ['a','b','c','d']

成对表示为[A,B]有点麻烦。A-B(与library(pairs)中使用的完全相同)是Prolog社区的首选方式。我同意。我只是提出了一个替代方案,没有使用配对。我本打算展示一种定制的pair类型的方法,但还是选择了这种方法作为替代方法。正如我在回答开始时所说:“如果您没有可用的pairs库,那么这里有一个更复杂的解决方案。”例如,我只使用了
gprolog
,所以我没有“library(pair)”。@mbratch Capelical指出,如果您有两个东西,您宁愿将它们表示为“pair”
a-B
,而不是列出两件事。在其他方面,你的方法非常好<代码>[A,B]实际上是
(A,((B,[]))
,因此您可以了解为什么
A-B
是首选。在这个上下文中,“结对”只是指两个需要暂时结合在一起的独立事物;破折号是表示一对的传统方式。谢谢鲍里斯。您建议如何在
gprolog
中这样做?除非您称呼我,否则我不会在收件箱中收到您的评论,也可能不会对此做出反应。从SWI Prolog网页查看库(pairs)的源代码。pairs表示为[A,B]有点麻烦。A-B(与library(pairs)中使用的完全相同)是Prolog社区的首选方式。我同意。我只是提出了一个替代方案,没有使用配对。我本打算展示一种定制的pair类型的方法,但还是选择了这种方法作为替代方法。正如我在回答开始时所说:“如果您没有可用的pairs库,那么这里有一个更复杂的解决方案。”例如,我只使用了
gprolog
,所以我没有“library(pair)”。@mbratch Capelical指出,如果您有两个东西,您宁愿将它们表示为“pair”
a-B
,而不是列出两件事。在其他方面,你的方法非常好<代码>[A,B]实际上是
(A,((B,[]))
,因此您可以了解为什么
A-B
是首选。在这个上下文中,“结对”只是指两个需要暂时结合在一起的独立事物;破折号是表示一对的传统方式。谢谢鲍里斯。您建议如何在
gprolog
中这样做?除非您称呼我,否则我不会在收件箱中收到您的评论,也可能不会对此做出反应。从SWI Prolog网页上查看库(pairs)的源代码。谢谢,这非常有效。也可以用这个库数数对吗?谢谢,这很有效。是否也可以使用此库计算对数?