Come verificare se esiste una regola in un database delle clausole del file prolog

StackOverflow https://stackoverflow.com/questions/321974

  •  11-07-2019
  •  | 
  •  

Domanda

Sto lavorando a un incarico universitario in cui devo verificare se esiste una determinata clausola (di fatto o di regola) nel database delle clausole corrente.

L'idea è di usare una regola la cui testa è verifica (+ nome, + argomenti). Questa regola dovrebbe essere vera se nel database esiste un'altra regola il cui nome è head (argomenti)

Qualsiasi aiuto sarebbe molto apprezzato ...

È stato utile?

Soluzione

L'uso di call / 1 non è una buona idea perché call / 1 in realtà chiama l'obiettivo, ma vuoi solo scoprire se il fatto / regola esiste e non si desidera attendere dopo un lungo calcolo che la chiamata potrebbe innescare e non si desidera stampare qualcosa sullo schermo se la regola chiamata a sua volta chiama ad es. writeln / 1 . Inoltre, si desidera che verifica / 2 abbia esito positivo anche se la chiamata non è andata a buon fine (ma il fatto / regola è altrimenti presente).

Come soluzione, SWI-Prolog offre callable/1

callable(+Term)

True if Term is bound to an atom or a compound term,
so it can be handed without type-error to call/1, functor/3 and =../2.

Ecco due versioni di verifica / 2 , una che utilizza call / 1 e l'altra che utilizza callable / 1 .

verify1(Name, Arguments) :-
    Term =.. [Name | Arguments],
    call(Term).

verify2(Name, Arguments) :-
    Term =.. [Name | Arguments],
    callable(Term).

father(abraham, isaac) :-
    writeln('hello').

father(abraham, adam) :-
    fail.

Altri suggerimenti

Conosci il concetto di unificazione? Quello che devi fare è: basta chiamare un predicato che assomigli a quello che stai cercando di trovare.

Quindi, diciamo che nel tuo database è:

father(abraham,isaac).

Ora vuoi chiamare qualcosa del tipo:

verify(father,[abraham,isaac]).

Il tuo corpo predicato dovrà quindi contenere un meccanismo per chiamare padre (abraham, isaac). che dovrebbe quindi restituire true. Chiamare padre (abraham, adam) dovrebbe fallire.

Per questo avrai bisogno di due predicati: = .. / 2 e call / 2 . Se si utilizza SWI-Prolog, chiamare help (= ..). e help (call) dalla riga di comando dell'interprete per accedere alla documentazione.

Spero di non aver rovinato l'incarico per te. Devi ancora scoprire cosa fare con i predicati parzialmente istanziati (quindi, dì qualcosa come verifica (padre, [abraham, X]). da solo, ma non dovrebbe essere difficile da qui .

Buona fortuna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top