【问题标题】:Prolog dynamic constraintsProlog 动态约束
【发布时间】:2016-02-12 15:48:20
【问题描述】:

我在 SICStus Prolog 中有一个运行以下约束的程序:

processList([Elem1,Elem2|_], X) :-
  (Elem1 #= 0 #/\ Elem2 #= X) #\/ 
   Elem1 #= X.

但我需要动态设置它

processList([Elem1,Elem2,Elem3|_], X) :-
  (Elem1 #= 0 #/\ Elem2 #= 0 #/\ Elem3 #= X) #\/ 
  (Elem1 #= 0 #/\ Elem2 #= X)                #\/
   Elem1 #= X.

如果我用 4 个元素调用它,我会有更大的限制,但模式总是一样的。

我已经查看了表谓词(tuples_in/2,在 SWI-Prolog 中),但这需要我计算所有可能的有效值组合。

有没有其他方法可以做到这一点?

【问题讨论】:

    标签: prolog restriction clpfd


    【解决方案1】:

    使用 built-in predicate append/3 and Prolog library 谓词 maplist/2 我们写:

    :- use_module(library(lists)), [maplist/2])。 进程列表(Zs,X):- append(Prefix, [X|_], Zs), % `Zs` 包含 `Prefix`,后跟 `X` maplist(=(0),前缀)。 % `Prefix` 中的所有项目都等于 0

    在 SICStus Prolog 4.3.2 中查看它!

    | ?- processList(Zs, X).
    Zs = [X|_A] ? ;
    Zs = [0,X|_A] ? ;
    Zs = [0,0,X|_A] ? ;
    Zs = [0,0,0,X|_A] ? ;
    Zs = [0,0,0,0,X|_A] ? ;
    ...
    

    【讨论】:

    • 我想我不够清楚。我正在使用约束逻辑编程(准确地说是使用 clpr 库),所以我不能真正声明元素为 0(就像 maplist 那样),我需要使用“#”运算符进行限制。当时我向我的教授展示了我无法创建动态限制,甚至他也无法解决问题(他们每年都会在课程中添加新问题以避免作弊)。我最终只需要使用第一段代码。
    • @CMJunior。请告诉我更多!我已经有一段时间没有使用 clp(R),但直觉上我会猜到它(原则上)可以与使用语法统一的普通 Prolog 互操作。
    • 我们需要制作 Easy as ABC 谜题的序言版本。需要的限制之一是,如果在列或行之前有一个字母,从列/行的角度看板,你需要看到那个字母,换句话说,所有的板空间,直到你看到字母从这个角度来看,它必须是白色的(在我们的代码中,值为 0)。对于实验室任务,我们还需要使棋盘尺寸动态化,这样用户就可以告诉程序他想在哪种棋盘尺寸上玩。这对生成此线程的限制造成了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    相关资源
    最近更新 更多