list - 在列表中分配变量
问题描述
我对 Prolog 列表有疑问。假设我有这个谓词:
array(p, [A,B,C]).
当我这样做时:
array(p,X).
我得到:X = [_,_,_]
现在,考虑到我有这个谓词:
p1(1) :- array(p1, [1,B1,C1]).
我期望得到:
X = [1,_,_]
但相反,结果与以前相同。在 Prolog 中甚至可能发生这样的事情吗?另一个问题是,如果我们能以某种方式设置这些值,我们能否以同样的方式覆盖这些值?我知道在序言中变量只分配一次,但我想以某种方式获得一个动态列表。
解决方案
我不确定你所说的“范式”是什么意思,我也不清楚你想用这段代码做什么。如果你在顶层有这个:
array(p, [A,B,C]).
您正在定义一个 fact array/2
,它p
与三个未实例化变量的列表相关联。您的第一个查询相当于检索此事实。
您的第二个“范式”实际上是规则或谓词的定义p1/1
,它采用单个参数,该参数必须为 1 才能触发规则。第二个谓词的主体是对肯定会失败的谓词array/2
的调用。我看不出你怎么可能得到和以前一样的结果,因为你之前定义array(p, ...)
过,现在你正在寻找array(p1, ...)
. 此外,X
在您的第二个查询中没有 no ,因此没有理由X
出现在结果中,而且肯定不会出现,即使您调用了array(p, ...)
而不是array(p1, ...)
.
我认为您在这里尝试做的可能是设置某种由三个变量组成的集合,然后在进行一些计算时依次统一它们中的每一个。在 Prolog 中做这样的事情是可能和容易的,但事实数据库不会真正参与这个过程。您将不得不编写将变量传递给其他谓词的谓词,这些谓词将统一它们并将它们返回绑定。这些都不是很难,但看起来你将不得不回去更好地理解这里的基础知识。你在这里离题太远了,我认为没有人能真正回答你所说的问题,因为它有太多的困惑。
推荐阅读
- vb.net - 当我在 vb.net 中将它作为参数传递时,如何让 checkbox.checked 事件触发?
- python - 我可以限制numpy可以选择分配给数组的可能dtypes吗
- java - 获取给定范围内的所有完美正方形
- shell - 手动工作正常不工作 cron 语法错误:“(”意外
- php - 如何在 post 方法中优化 if else?
- docker - 无缘无故推送到heroku期间找不到run.sh
- flutter - Flutter 中的某些 API 需要 ui.Image。在某些情况下(当然是用于原型设计),我会使用内置的 Icons.xyz。如何转换为图像?
- angular - 使用按键选择 PrimeNG 表上的行
- arrays - Excel过滤器功能将多个水平过滤器浓缩为1个垂直过滤器
- amazon-web-services - 云看日志洞察查询,结合两个查询