Prolog 通配符:重复列表而不更改通配符值

Posted

技术标签:

【中文标题】Prolog 通配符:重复列表而不更改通配符值【英文标题】:Prolog Wildcard: Duplicate list without changing wildcard values 【发布时间】:2013-11-19 05:01:58 【问题描述】:

直奔主题:

我在处理 Prolog 的统一系统时遇到问题,以及通配符在通过我的程序时会发生什么。我的代码如下:

board(B) :- [R1, R2, R3, R4, R5, R6, R7, R8, R9] = B,
        noDuplicatesRows([R1, R2, R3, R4, R5, R6, R7, R8, R9]),
        horzAllWorthy([R1, R2, R3, R4, R5, R6, R7, R8, R9]),
        vertAllWorthy([R1, R2, R3, R4, R5, R6, R7, R8, R9]).

棋盘是数独棋盘。 我基本上是在测试板上的行是否有重复的数字,然后测试行和列是否通过某些约束。问题是行中有通配符来表示空位(布局如下:[_,1,4,3_ ....等])。根据我收集的信息,当我通过 noDuplicatesRows 运行 B 时,通配符点在通过其他两个过程之前被赋予了值,这不是我想要的。但是,由于 Prolog 的统一系统,我似乎无法解决这个问题(而且我已经尝试过复制列表!)。

这里有任何答案,还是我会以非常非 Prolog 的方式解决这个问题?

编辑:辅助功能代码

noDuplicatesRows([]).
noDuplicatesRows([H|T]):- usedNumbersRow(H, X), diff(X), !, noDuplicatesRows(T).

usedNumbersRow([], []).
usedNumbersRow([X|Xs], R) :- var(X), validval(X), !, usedNumbersRow(Xs, R).
usedNumbersRow([X|Xs], [X|R]) :- usedNumbersRow(Xs, R).

diff([H]).
diff([H|T]):- not(member(H,T)), diff(T).

【问题讨论】:

【参考方案1】:

这不是一个真正的“答案”,但太长了,无法放在评论中:

“通配符”这个词在这里用处不大。你有变量。它们可以是免费的,也可以被实例化为一个值。没有什么说谓词必须实例化传递给它的所有参数,这就是您使用_ 的原因:表示您不想真正对变量做任何事情。例如:

nothing(_).

传递给此谓词的参数将不会被进一步实例化。或者,换一种说法,无论你给nothing/1 提供什么论据,它都会在它进入时出现。

所以这里真正的问题可能是:程序中的辅助谓词如何处理传递给它们的参数?

无论如何,如果您的目标是解决数独问题,您最终必须实例化所有变量(初始板上未知的字段),以便满足所有约束。

如果您有更具体的问题,帮助您解决所面临的问题会更容易。

编辑:

_ 不会转到您正在调用的谓词。它只在它出现的谓词从句的上下文中很重要。在您的情况下,可能是 validval(X) 实例化变量(同样,我不知道它的作用!)

【讨论】:

啊,那么我认为正在发生的事情是我的辅助函数正在实例化 _s 而我不希望它们这样做。问题是我有点不确定如何防止这种情况。我已经在帖子中添加了辅助功能代码;关于我可能在哪里实例化的任何提示?

以上是关于Prolog 通配符:重复列表而不更改通配符值的主要内容,如果未能解决你的问题,请参考以下文章

使用通配符替换字符串 php [重复]

Python Pandas Regex:在列中搜索带有通配符的字符串并返回匹配项[重复]

对多个指标求和而不通过通配符求和?

Select2 - 搜索通配符匹配

定义包含通配符(*)的crontab作业,而不扩展它们

MySQL别名列通配符[重复]