首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在表格中显示SWI-Prolog程序的结果?(CLP问题)

如何在表格中显示SWI-Prolog程序的结果?(CLP问题)
EN

Stack Overflow用户
提问于 2020-05-13 15:27:53
回答 1查看 74关注 0票数 2

我正在尝试解决SWI-Prolog中的CLP问题。这项任务与斑马问题非常相似。共有25个变量的域在1到5之间。因此,相关变量将获得相同的标签。(该程序是用匈牙利语编写的。)

我希望输出不仅显示分配给变量的标签,还显示表中的相关变量。有没有办法做到这一点?

代码语言:javascript
复制
% Constraint Logic Programming
:- use_module(library(clpfd)).
:- use_module(library(lists)).
% Your program goes here

egyetemista(X, All):-
    All = [Egressy,Fenyvesi,Gallyas,Jeney,Vadkerti,
            Edina, Frida, Gabriella, Jozsef, Vince,
            Budapest,Debrecen,Miskolc,Pecs,Szeged,
            Biologia,Informatika,Jog,Kemia,Magyar],
    All ins 1..5,
    all_different([Egressy,Fenyvesi,Gallyas,Jeney,Vadkerti]),
    all_different([Edina, Frida, Gabriella, Jozsef, Vince]),
    all_different([Budapest,Debrecen,Miskolc,Pecs,Szeged]),
    all_different([Biologia,Informatika,Jog,Kemia,Magyar]),

    Fenyvesi #= Jog,
    Fenyvesi #\= Debrecen,
    Fenyvesi #\= Jozsef,
    Fenyvesi #\= Vince,

    Jozsef #\= Gallyas,
    Jozsef #\= Biologia,
    Jozsef #= Budapest,

    Vadkerti #= Gabriella,
    Vadkerti #\= Kemia,
    Vadkerti #\= Szeged,
    Gabriella #\= Kemia,
    Gabriella #\= Szeged,
    Kemia #= Szeged,

    Jeney #= Pecs,
    Jeney #\= Vince,

    Frida #= Magyar,

    Edina #= Egressy #\ Edina #= Miskolc,

    Informatika #\= Edina,
    Informatika #\= Frida,
    Informatika #\= Gabriella,

    labeling([], All),

    %Szak:
    nth0(N, All, Szeged),
    nth0(N, All, X).

    %egyetemista(X, All)

如果像这样运行程序,输出结果是: All = 1,2,3,4,5,2,4,5,1,3,1,5,2,4,3,5,1,2,3,4,X=3

这意味着分配给变量'Szeged‘的标签是3,并且相关变量是通过替换输出上标签也为3的All列表中的变量来获得的。例如,表格的第一行可以是:'gallyas vince kemia‘。

非常感谢你提前这么做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-13 16:09:26

Prolog不能在源代码中从变量映射回它的名称,因此您需要自己保留一个映射。一种简单的方法是这样做:

代码语言:javascript
复制
egyetemista(X, AllPairs):-
    AllPairs = [
        egressy-Egressy, fenyvesi-Fenyvesi, gallyas-Gallyas, jeney-Jeney, vadkerti-Vadkerti,
        edina-Edina, frida-Frida, gabriella-Gabriella, jozsef-Jozsef, vince-Vince,
        budapest-Budapest, debrecen-Debrecen, miskolc-Miskolc, pecs-Pecs, szeged-Szeged,
        biologia-Biologia, informatika-Informatika, jog-Jog, kemia-Kemia, magyar-Magyar
    ],
    pairs_values(AllPairs, All),
    All ins 1..5,
    % ... the rest of your definition unchanged

在对此的调用中可见的结果是Name-Value对的列表:

代码语言:javascript
复制
?- egyetemista(X, All).
X = 3,
All = [egressy-1, fenyvesi-2, gallyas-3, jeney-4, vadkerti-5, edina-2, frida-4, gabriella-5, ... - ...|...] ;
X = 3,
All = [egressy-1, fenyvesi-2, gallyas-3, jeney-4, vadkerti-5, edina-2, frida-4, gabriella-5, ... - ...|...] ;
X = 3,
All = [egressy-1, fenyvesi-2, gallyas-3, jeney-4, vadkerti-5, edina-2, frida-4, gabriella-5, ... - ...|...] ;
X = 3,
All = [egressy-1, fenyvesi-2, gallyas-3, jeney-4, vadkerti-5, edina-2, frida-4, gabriella-5, ... - ...|...] .  % etc.

然后,您可以只筛选出其值等于X的那些条目,并以您喜欢的任何格式打印这些条目。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61768707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档