Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/prolog/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 从两个目标中扣除_Prolog - Fatal编程技术网

Prolog 从两个目标中扣除

Prolog 从两个目标中扣除,prolog,Prolog,假设我有这样的目标: times(0,_,0). % zero times X is zero times(X,Y,Z) :- times(Y,X,Z) ,!. % X * Y = Y * X 当我试图问: ?- times(0,1,X). 我得到了双重答案: X = 0 ; X = 0. 可能是因为第一个答案是从事实推导出来的,第二个答案是从规则推导出来的。 问题-如何使序言只给出一个答案而不是两个答案?添加一个剪辑以“确认”

假设我有这样的目标:

times(0,_,0).                          % zero times X is zero
times(X,Y,Z) :- times(Y,X,Z) ,!.       % X * Y = Y * X
当我试图问:

?- times(0,1,X).
我得到了双重答案:

X = 0 ;
X = 0.
可能是因为第一个答案是从
事实
推导出来的,第二个答案是从
规则
推导出来的。

问题-如何使序言只给出一个答案而不是两个答案?

添加一个剪辑以“确认”第一个选项:

times(0,_,0) :- !. 
从第二个开始禁止0:

times(X,Y,Z) :- X \= 0, times(Y,X,Z).
我已删除剪切,但如果有更多规则,请保留它。
但我认为“反身性”规则会给你带来麻烦,因为它会过度递归

你必须这样做。添加事实,然后添加对这些事实起作用的规则。或者对我来说可读性更好:
times(0,0):-true:-)