如何在 table 中显示 SWI-Prolog 程序的结果? (中电问题)
How can I display the results of an SWI-Prolog program in a table? (CLP problem)
我正在尝试解决 SWI-Prolog 中的 CLP 问题。该任务与斑马问题非常相似。域在 1 到 5 之间的共有 25 个变量。因此相关变量将获得相同的标签。
(该程序是用匈牙利语编写的。)
我希望输出不仅显示分配给变量的标签,还显示 table 中的相关变量。有办法吗?
% 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)
如果你运行这样的程序,输出是:
所有 = [1, 2, 3, 4, 5, 2, 4, 5, 1, 3, 1, 5, 2, 4, 3, 5, 1, 2, 3, 4],
X = 3
这意味着分配给变量 'Szeged' 的标签是 3,关联的变量是通过替换 All 列表中在输出中也具有标签 3 的变量获得的。
因此,例如,table 的第一行可能是:'gallyas vince szeged kemia'
在此先感谢您。
Prolog 无法从源代码中的变量映射回其名称,因此您需要自己保留一个映射。一个简单的方法是这样的:
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
对的列表:
?- 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
的条目,并以您喜欢的任何格式打印这些条目。
我正在尝试解决 SWI-Prolog 中的 CLP 问题。该任务与斑马问题非常相似。域在 1 到 5 之间的共有 25 个变量。因此相关变量将获得相同的标签。 (该程序是用匈牙利语编写的。)
我希望输出不仅显示分配给变量的标签,还显示 table 中的相关变量。有办法吗?
% 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)
如果你运行这样的程序,输出是: 所有 = [1, 2, 3, 4, 5, 2, 4, 5, 1, 3, 1, 5, 2, 4, 3, 5, 1, 2, 3, 4], X = 3
这意味着分配给变量 'Szeged' 的标签是 3,关联的变量是通过替换 All 列表中在输出中也具有标签 3 的变量获得的。 因此,例如,table 的第一行可能是:'gallyas vince szeged kemia'
在此先感谢您。
Prolog 无法从源代码中的变量映射回其名称,因此您需要自己保留一个映射。一个简单的方法是这样的:
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
对的列表:
?- 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
的条目,并以您喜欢的任何格式打印这些条目。