具有可变数量参数的Prolog谓词

 北大青鸟西安 发布于 2023-02-08 10:33

我正在用PROLOG写一个Sudoku-Solver.我希望求解器能够使用所有可能大小的Sudokus,所以我自然需要构造带有可变数量参数的谓词.(例如,在Sudoku中构造"块".)

如何使用可变数量的参数构造或模拟谓词?

1 个回答
  • SWI-Prolog - 作为一些其他系统 - 提供无限制的arity,那么如果你愿意,你可以实际使用'数组'.只需像使用向量一样命名谓词即可.示例分配器:

    22 ?- functor(A,a,10).
    A = a(_G366, _G367, _G368, _G369, _G370, _G371, _G372, _G373, _G374, _G375).
    

    您经常分配和修改:

    30 ?- functor(A,a,4),arg(2,A,ciao).
    A = a(_G4841, ciao, _G4843, _G4844).
    

    当然,由于许多Prolog习语都基于列表,你负责任何算法,但请注意,通过arg/3 可以获得非确定性(la member/2).我的意思是,它可以搜索参数索引:

    31 ?- arg(A,a(1,2,ciao,4),ciao).
    A = 3 ;
    false.
    

    编辑,因为你要使用库(clpfd),一个更好的构造函数可能是= ../2

    ?- length(L, 9), L ins 1..9, A =.. [a | L].
    L = [_G3778, _G3781, _G3784, _G3787, _G3790, _G3793, _G3796, _G3799, _G3802],
    A = a(_G3778, _G3781, _G3784, _G3787, _G3790, _G3793, _G3796, _G3799, _G3802),
    _G3778 in 1..9,
    _G3781 in 1..9,
    _G3784 in 1..9,
    _G3787 in 1..9,
    _G3790 in 1..9,
    _G3793 in 1..9,
    _G3796 in 1..9,
    _G3799 in 1..9,
    _G3802 in 1..9.
    

    2023-02-08 10:36 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有