2

我是 prolog 的新手,我想知道是否有人可以帮助我解决这个问题。问题:给定整数 1,2,3,4,以及谓词 mult/2、div/2、div/2、minus/2、minus/2 和 eval/2,我需要编写一个谓词解决方案/1 ,当这样调用时:

?- solutions(L).

它应该以变量 L 结束,该变量统一为值为 6 的表达式列表。表达式的形式为:

X, Y, exp/2

但是我的代码不起作用。我有两个版本。第一个冻结了 SWI-Prolog,在我输入句号后不返回任何答案,之后也不让我评估其他任何内容:

eval(1,1.0).
eval(2,2.0).
eval(3,3.0).
eval(4,4.0).

eval(mult(X,Y),Z) :-
    eval(X,A),
    eval(Y,B),
    Z is A*B.

eval(div(X,Y),Z) :-
    eval(X,A),
    eval(Y,B),
    Z is A/B.

eval(minus(X,Y),Z) :-
    eval(X,A),
    eval(Y,B),
    Z is A-B.

solutions(L) :-
    setof(X,eval(X,6),L),
    print(L).

当我键入时,第二个版本只返回 false ?- solutions(L).

solutions(L) :-
    setof([exp,X,Y],eval(exp(X,Y),6),L),
    print(L).

非常感谢您花时间提供帮助!

4

2 回答 2

0

问题是您的代码使用 eval/2 谓词进行无限递归。

你可以试试这个解决方案:

num(1).
num(2).
num(3).
num(4).

eval(mult(A,B),Z) :-
    num(A),
    num(B),
    Z is A*B.

eval(div(A,B),Z) :-
    num(A),
    num(B),
    Z is A/B.

eval(minus(A,B),Z) :-
    num(A),
    num(B),
    Z is A-B.

test(L) :-
    setof(X,eval(X,6),L),
    print(L). 

产生:

?- test(L).
[mult(2,3),mult(3,2)]
L = [mult(2, 3), mult(3, 2)].
于 2015-12-13T03:56:57.843 回答
0

也许你正在寻找类似的东西

solutions(L) :-
    Ns = [1,2,3,4],
    Ex = [*,/,-],
    findall((X,Y,E),
       (member(X,Ns),member(Y,Ns),member(E,Ex),F=..[E,X,Y],6=:=F),
       L).

产生

?- solutions(L).
L = [(2, 3,  (*)),  (3, 2,  (*))].

表达式通常是递归的,也就是说,参数可以是表达式而不是普通数字。但是,在我看来,您的问题未得到充分说明,因为我们需要标准来阻止解决方案的无限流动 - 例如 - 通过重复应用不改变值的操作。就像乘以或除以 1。

于 2015-12-13T06:45:44.963 回答