如何在prolog中结束查询的条件?

时间:2016-03-02 06:27:12

标签: prolog

我是prolog中的新手,所以我做了一个程序,它有一个方法来查询某些东西,但是当我使用它时,即使它应该结束它仍然会产生结果。

import {Component,bind,CORE_DIRECTIVES} from 'angular2/core';
import {SharedService} from 'src/shared.service';
@Component({
    selector: 'main-app',

    template: `<h1> MainComponent</h1>
    <button (click)="changeName()">Change Name</button>
    `
})

export class MainComponent {



    constructor(ss: SharedService) {
      this.ss = ss;
    }

    changeName() {
      this.ss.change();
    }
}

例如,当我执行

import {Component, Injectable,Input,Output,EventEmitter} from 'angular2/core'


@Injectable()
export class SharedService {
  @Output() fire: EventEmitter<any> = new EventEmitter();

   constructor() {
     console.log('shared service started');
   }

   change() {
    console.log('change started'); 
     this.fire.emit(true);
   }

   getEmittedValue() {
     return this.fire;
   }

} 

它应该给我这个答案:

  

X = omarpacheco; X = jasonancona; X = jorgebolio; X = gerardoadrian   ;

但它真正做的是重复这些答案而不是像这样结束

  

X = omarpacheco; X = jasonancona; X = jorgebolio; X = gerardoadrian   ; X = omarpacheco; X = jasonancona; X = jorgebolio; X =   gerardoadrian。 。 。 。 。 。 。 。 。 。 。 。 (重复)...........

所以,这就是为什么我会重复你们的原因,我需要知道如何建立一个不让重复答案的条件。 对不起我顺便说一下我的英语不好。

我忘了说在这种情况下一定只有一个谓词&#34; amigos&#34;

1 个答案:

答案 0 :(得分:2)

这很简单:使用两个谓词而不是一个!

第一个谓词仅包含事实:

amigos(juanarjona, omarpacheco).
amigos(juanarjona, jasonancona).
amigos(juanarjona, jorgebolio).
amigos(juanarjona, gerardoadrian).

第二个建立在第一个之上 - 提供对称闭包 1

sym_amigos(X, Y) :- amigos(X, Y).
sym_amigos(X, Y) :- amigos(Y, X).

使用SICStus Prolog 4.3.2的示例查询:

| ?- sym_amigos(P, Q).
P = juanarjona,    Q = omarpacheco   ? ;
P = juanarjona,    Q = jasonancona   ? ;
P = juanarjona,    Q = jorgebolio    ? ;
P = juanarjona,    Q = gerardoadrian ? ;
P = omarpacheco,   Q = juanarjona    ? ;
P = jasonancona,   Q = juanarjona    ? ;
P = jorgebolio,    Q = juanarjona    ? ;
P = gerardoadrian, Q = juanarjona    ? ;
no

随着你的事实基础变得越来越大,查看所有具体的答案会让人厌烦......所以,要检查sym_amigos/2 是否普遍终止,我们可以运行这样的查询之一:

| ?- sym_amigos(P, Q),      % looking for amigos ...
     false.                 % ... we discard every candidate solution.
no                          % "no" means "terminates universally"

以上查询永远不会产生任何解决方案 - 毕竟,它是与目标false/0的结合:

  • 可以,但是,告诉我们上述目标是否会普遍终止。
  • 如果Prolog返回no - 它确实 2 - 我们知道sym_amigos/2普遍终止。

脚注1: symm/2涵盖了常见的成语&#34; symmetric closure&#34;。
脚注2: SWI-Prolog不回复no,而是回复false。 功能