Prolog 查找与和相加的整数组合

Prolog 查找与和相加的整数组合,prolog,Prolog,我正在尝试编写一个程序,该程序接受语句X+Y=Sum,并且可以查询以输出给定和的X和Y的可能值。X和Y中的每一个都可以是[0,Sum]中的整数。例如,对于X+Y=10,我想得到0,10,1,9,…,10,0 如何在Prolog中实现这一点?有许多方法可以解决这一问题,具体取决于您想要如何定义和约束问题。第一次尝试是: 0和10之间的哪对数字的总和是10 您需要键入以下内容:;在每个解决方案之后: ?- between(0, 10, X), between(0, 10, Y), plus(X, Y

我正在尝试编写一个程序,该程序接受语句X+Y=Sum,并且可以查询以输出给定和的X和Y的可能值。X和Y中的每一个都可以是[0,Sum]中的整数。例如,对于X+Y=10,我想得到0,10,1,9,…,10,0


如何在Prolog中实现这一点?

有许多方法可以解决这一问题,具体取决于您想要如何定义和约束问题。第一次尝试是:

0和10之间的哪对数字的总和是10

您需要键入以下内容:;在每个解决方案之后:

?- between(0, 10, X), between(0, 10, Y), plus(X, Y, 10).
X = 0,
Y = 10 ;
X = 1,
Y = 9 ;
X = 2,
Y = 8 ;
X = 3,
Y = 7 ;
X = 4,
Y = 6 ;
X = Y, Y = 5 ;
X = 6,
Y = 4 ;
X = 7,
Y = 3 ;
X = 8,
Y = 2 ;
X = 9,
Y = 1 ;
X = 10,
Y = 0 ;
false.
?- use_module(library(clpfd)).
true.

?- [X,Y] ins 0..10, X + Y #= 10, label([X,Y]).
X = 0,
Y = 10 ; % etc
对你的问题的评论给了你很多有用的建议,告诉你从这里走到哪里。这种解决方案本身对理解或学习Prolog没有多大帮助。在我个人看来,CLPFD解决方案也不是:

?- between(0, 10, X), between(0, 10, Y), plus(X, Y, 10).
X = 0,
Y = 10 ;
X = 1,
Y = 9 ;
X = 2,
Y = 8 ;
X = 3,
Y = 7 ;
X = 4,
Y = 6 ;
X = Y, Y = 5 ;
X = 6,
Y = 4 ;
X = 7,
Y = 3 ;
X = 8,
Y = 2 ;
X = 9,
Y = 1 ;
X = 10,
Y = 0 ;
false.
?- use_module(library(clpfd)).
true.

?- [X,Y] ins 0..10, X + Y #= 10, label([X,Y]).
X = 0,
Y = 10 ; % etc
您可以定义如下谓词:

foo(X + Y = Sum) :-
    between(0, Sum, X),
    between(0, Sum, Y),
    plus(X, Y, Sum).
您可以尝试调用fooX+Y=10、fooX+3=5、foo1+Y=10或foo2+2=4,依此类推。更好的是,尝试使用CLPFD实现,看看如何使用该程序

我能想到的最直观的Python解决方案是:

>>> [(x,y) for x in range(0,11) for y in range(0,11) if x+y == 10]
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5), (6, 4), (7, 3), (8, 2), (9, 1), (10, 0)]
作为练习,试着看看你将如何在函数中总结这一点


我敦促您尝试用C语言解决这个问题,只是为了看看需要付出多少努力。

这不是一个好的第一个Prolog程序。以Sterling&Shapiro这样的教科书为例。如果从普通命令式编程的角度来看,Prolog是违反直觉的。忘掉你对编程的了解,从一个全新的头脑开始。如果你学的第一门语言是Prolog,那么其他语言就会显得很奇怪;初学者总是很难做到这一点,因为他们试图将其映射到现有的编程模式。这是一个非常不同的模式。除了false的推荐书之外,还有一些合理的入门教程,比如刚刚开始的教程。一旦你掌握了Prolog的基础知识,然后读了一点有限域上的CLPFD约束逻辑编程,那么找到X+Y=10的解将变得非常简单顺便说一句,在您最初的问题陈述中,您缺少了有关约束的信息,例如,X和Y的域是什么?它们都是整数>=0,顺便说一下,在您学习了如何用Prolog进行思考之后,您会发现用其他非Prolog语言做某些事情要繁琐得多